[Что касается кодировки символов] Кодировка ASCII, GB2312, GBK, UTF-8 и наборы символов Unicode
[Что касается кодировки символов] Кодировка ASCII, GB2312, GBK, UTF-8 и наборы символов Unicode
Предисловие

Часто ли мы сталкиваемся с такими проблемами во время разработки?,Например, если вы создаете проект в VS2019,Внутри есть программы на языке C и китайские комментарии.,один день,По потребностям работы,Вам необходимо пересадить некоторые файлы C и H в проект Keil.,При копировании и вставке соответствующих файлов в проект Keil,и при открытии с помощью MDK,Но нашел,Файл, который вы пересадили в программу на языке Си, отображается нормально.,Но китайский превратился в кучу искаженных иероглифов.,А при компиляции выскакивают разные необъяснимые ошибки. На самом деле это может быть связано с тем, что ваши VS2019 и Keil используют разные методы кодирования.,Потому что большинство кодировок совместимы с Кодировка ASCII., тогда как программа на языке C использует английские символы, используя Кодировку ASCII,Так что отображается нормально,Китайское кодирование другое.,Например, тот же 0xB0A1 в Память,Используйте разные стандарты кодирования для декодирования 0xB0A1.,Вы можете получить разные китайские иероглифы.

В компьютерном мире есть только два числа: 0 и 1. Будь то английские, китайские или цифры, все они хранятся в компьютере в виде 01. Следовательно, если вы хотите сохранить текст на компьютере, вам необходимо указать определенную последовательность 01 для представления текста. Кодирование — это процесс указания конкретной последовательности 01 для представления текста. Кодирование представляет собой форму хранения символов в компьютере.


1. Что такое кодирование? Какова связь между типами данных и кодировкой?

Символы, цифры, английские буквы, изображения, видео, аудио и т. д., которые мы часто видим в компьютерах, хранятся в компьютерах в двоичной форме, поскольку карты памяти состоят из электронных компонентов и имеют только высокую электрическую мощность. Их два. состояния флэта и низкого уровня, а именно два значения 0 и 1. Фактически, понятия, которые мы называем базовыми системами, такими как десятичная и восьмеричная, а также типы данных, такие как char, int и float, предназначены для программистов. Например, десятичное и шестнадцатеричное представление чисел для нас просто разные. каждая десятая и каждая шестнадцатая и типы данных int, char, unsigned; int и т. д. Эти типы данных имеют разные интерпретации памяти. Типы данных указывают различные диапазоны данных, которые может представлять эта память. Например, char занимает один байт, а представленный диапазон данных составляет 0–255, а int — 4 байта. , unsigned int представляет беззнаковые 4-байтовые данные. Иногда в программе мы выполняем преобразование типов переменных, например десятичное в шестнадцатеричное или char в int. Все эти преобразования представляют собой интерпретации памяти (в основном размера памяти, диапазона данных). Например, char b, затем b занимает один байт. , мы устанавливаем b=1, а затем преобразуем (int) b. Фактически, b по-прежнему равно 1, но теперь интерпретируется как занимающее 4 байта памяти. Короче говоря, в приведенных выше случаях, независимо от того, как выполняется преобразование, одни и те же данные не изменят фактические данные в памяти из-за преобразования типа. Когда b имеет тип char, это 00000001. После преобразования в тип int. , он становится 000000000000000000000000000000001. Это все тот же 1, независимо от того, шестнадцатеричный ли это 0x01 или десятичный 1, это указанный выше двоичный файл в памяти. Это связано с тем, что тип данных — это всего лишь описание памяти, и то, что действительно определяет, как они хранятся в компьютере (будь то последовательность 0001 или последовательность 1110), — это кодировка, относящаяся к тому, как данные хранятся в виде. последовательность 01 в компьютере.

Тип данных — это псевдоним блока памяти фиксированного размера, который описывает диапазон размеров данных, которые может представлять эта память; Набор символов определяет соответствие между текстом и двоичным кодом и присваивает каждому тексту уникальный номер «один к одному». Кодировка символов определяет, как текстовые числа хранятся в компьютере.

2. Английская кодировка символов

Кодировка ASCII

кодирование в 8-битном двоичном формате,Используется для представления управляющих символов, английских символов и числовых символов. Потому что использование 8-битного двоичного кодирования,Таким образом, Кодировка ASCII может представлять только 256 символов.,Диапазон чисел: 0–255. Обычно используемые коды ASCII следующие:

Представляет персонажей

шестнадцатеричная форма

Десятичная форма

0~9

0x30~0x39

48~57

A~Z

0x41~0x5A

65~90

a~z

0x61~0x7A

97~122

Будь то код ASCII шестнадцатеричная формат: десятичный код ASCII форма,Это объяснительная концепция,Форма интерпретации данных Память,Используется для выражения концепций программистам.,Они хранятся в компьютере как одни и те же двоичные числа.,Он не изменится из-за изменения базы. Этот процесс использования 8-битного двоичного кода для представления или хранения символов называется кодированием (процесс взаимно однозначного соответствия между строкой двоичных 01 и символом). Набор символов, представленный кодами ASCII, называется набором символов ASCII.

В английском мире все английские слова можно записать с помощью 26 букв, и каждая буква является символом. Таким образом, весь английский мир можно закодировать с помощью 8-битных кодов ASCII.

3. Китайская кодировка

Английскую кодировку можно заменить алфавитной, поскольку все английские слова можно разбить на комбинации из 26 английских букв. Но китайский иероглиф - это целое, и его можно закодировать только одним символом. Если для кодирования используются только 8-битные коды ASCII, этого явно недостаточно. представляют. Существует 256 китайских символов, поэтому существуют следующие методы китайского кодирования.

1. Стандарт GB2312

GB2312 охватывает в общей сложности 6763 часто используемых китайских символа. Стандарт GB2312 удаляет расширенный набор символов после номера 127 в таблице кодов ASCII и предусматривает, что коды меньше 127 (0x7F) будут декодироваться в соответствии со стандартом ASCII. Появляются последовательные коды больше 127 (0x7F). При кодировании эти два последовательных кода больше 0x7F представляют китайский символ, а первый и второй байты кодируются с помощью 0xA1 ~ 0xFE. Среди них исходные числовые символы, английские символы, знаки препинания и т. д. в коде ASCII называются символами половинной ширины, а соответствующие кодировки символов, превышающие 0x7F, называются символами полной ширины.

Правила декодирования GB2312: при использовании стандарта кодирования GB2312 при наличии строки кодировок символов обнаружение осуществляется по байтам. Сначала определите размер каждого байта. Если значение байта меньше 0x7F, используйте стандарт ASCII для декодирования. представляют собой два последовательных символа. Если значение каждой секции больше 0x7F, два байта рассматриваются как целое и декодируются с использованием стандарта GB2312.

Пример:

0x61

0xB0

0xA1

0x61

Обнаружение начинается с первого байта, 0x61 меньше 0x7F, декодируется стандартом ASCII и представляет английский символ «a», второй байт 0xB0 больше 0x7F, третий байт 0xA1 больше 0x7F, два последовательных байта больше чем 0x7F, соедините их в один и используйте GB2312 для декодирования его в китайский иероглиф «ах». Четвертый байт 0x61 меньше, чем 0x7F, используйте стандартное декодирование ASCII, он представляет английский символ «а». Подводя итог, его можно расшифровать следующим образом

0x61

0xB0

0xA1

0x61

a

ах

a

2. Кодировка GBK

GBKкодирование добавляет 14240 китайских иероглифов на основе GB2312.、Редкие слова исимвол。в соответствии сGB2312изкодирование Способ,Двух байтов уже недостаточно,В это время,GBKкодирование установило новый стандарт: пока появляется байт больше 0x7F,Тогда этот байт и следующий за ним байт в целом представляют китайский иероглиф (GB2312 предусматривает, что оба байта больше 0x7F для представления китайского иероглифа),Преимущество этого в том, что,GBKкодирование Совместимый Кодировка ASCIIиGB2312кодирование。

Правила декодирования GBK: При использовании стандарта кодирования GB2312 при заданной строке кодировок символов обнаружение выполняется по байтам. Сначала определяется размер каждого байта. Если значение байта меньше 0x7F, для декодирования используется стандарт ASCII. Если он встречает символ больше, чем для байта 0x7F, байт и следующий байт декодируются с использованием стандарта GBK, а затем обнаружение обхода продолжается с третьего байта.

Пример:

0x61

0xB0

0x56

0x62

Начните обнаружение с первого байта, 0x61 меньше 0x7F, используйте стандартное декодирование ASCII, оно представляет английский символ «a», второй байт 0xB0 больше 0x7F, затем соедините 0xB0 и 0x56 вместе и используйте стандартное декодирование GBK, а затем Продолжаем обнаружение начиная с 0x62, после декодирования это выглядит следующим образом

0x61

0xB0

0x56

0x62

a

Чи

b

3. Другие китайские кодировки

Кодировка GB18030: использует 4-байтовую кодировку, совместимую с ASCII, GB2312 и GBK. Включая GB18030-2000, скомпилированную в 2000 году, и GB18030-2005, скомпилированную в 2005 году.

Big5кодирование: в основном используется на Тайване, в Гонконге и других местах.,В основном включает в себя традиционные китайские иероглифы. Что касается количества китайских иероглифов, которые он содержит.,Big5 — это разновидность GBK.,Но способ кодирования между ними различен.,Например, тот же «ах»,GBKкодирование — 0xB0A1.,Big5кодирование — 0xB0DA.

4. Набор символов Юникода

В каждой стране и регионе свой набор текстов.,В разных системах письма используются разные стандарты кодирования.,Это поднимает вопрос,Одно и то же двоичное кодирование может представлять разные символы в разных стандартах кодирования.,Например 0xB0A1,«ах» в стандарте GBKкодирования,В стандарте кодирования Big5 это слово не используется. так,Несовместимость различных стандартов кодирования делает его очень неудобным в использовании. Международная организация по стандартизации ISO,Унифицировать нумерацию букв, символов и слов, используемых во всех языках мира.,Каждому символу присваивается соответствующая ему уникальная метка (номер кода ASCII остается неизменным).,Номера символов варьируются от 0x000000 до 0x10FFFF.,Этот набор номеров называетсяUniversal Multiple-Octet coded Character Set, называемый UCS, также обычно называется Unicode. Набор символов Unicode только нумерует все символы и не определяет правила кодирования для этих чисел. Поэтому позже появились различные правила кодирования Unicode для Unicode. Transformation Формат, типичные правила кодировки Unicode, такие как UTF-8, UTF-16, UTF-32 и т. д.

1. UTF-32

Unicode Transformation Format 32, кодирование с использованием 32 бит (4 байта) набора символов Unicode. кодирование, каждый символ в наборе символов Юникода представлен 4 байтами, а соответствующий Номер символа непосредственно Юникода преобразуется в двоичное число для хранения. И как раз потому, что UTF-32 использует 4 байта на каждую кодировку символы, поэтому UTF-32 несовместим с Кодировкой. ASCII,Программы, написанные с использованием стандарта Кодировка ASCII.,При открытии через кодировку UTF-32 символы будут отображаться искаженно.

При декодировании он определяется сразу по четырем байтам, а кодировка соответствует метке Unicode один к одному.

Персонаж:А

Кодировка ASCII:0x41

Номер Юникод: 0x0000 0041

Кодировка UTF-32: 0x0000 0041

Персонаж: ах

Кодировка ГБК: 0xB0A1

Номер Юникода: 0x0000 554A

Кодировка UTF-32: 0x0000 554A.

2. UTF-16

Unicode Transformation Format 16, кодирование набором символов Unicode с использованием 16 бит (2 байта) или 32 бита (4 байта). Используйте 2-байтовое кодирование для символов с номерами символов Юникода от 0 до 65535 и напрямую преобразуйте номер каждого символа в 2-байтовое двоичное число 0x0000~0xFFFF. Числа в наборе символов Юникода в диапазоне 0xD800~0xDBFF не представляют никаких символов. UTF-16 использует это число для сопоставления номеров символов, превышающих 0xFFFF, в наборе символов Юникода для получения расширенного 4-байтового кодирования. UTF-16 также несовместим с Кодировкой. ASCII。

При декодировании UTF-16 он определяется по двум байтам. Если эти два байта не находятся между 0xD800 ~ 0xDFFF, это означает, что это двухбайтовый кодированный символ, и используется двухбайтовое декодирование, если эти два байта находятся между 0xD800; ~0xDFFF, это означает, что это 4-байтовый закодированный символ, который декодируется в 4 байта.

2. UTF-8

Формат преобразования Unicode 8 использует 1, 2, 3 и 4 байта для кодирования набора символов Unicode. Каждый символ кодируется соответственно в соответствии с собственным диапазоном номеров. Правила его кодирования следующие:

Для однобайтового кодирования UTF-8,Старший бит этого байта установлен в 0.,Заполните оставшиеся биты символамииз Номер В Юникоде для Нет Символы Юникода в 0x00000000~0x0000007F, Кодировка UTF-8 требует только один байт и совместим с Кодировкой. ASCII. При N-байтовом кодировании, начиная со старшего бита первого байта, первые N позиций устанавливаются в 1, N+1-й бит - в 0, а старший бит остальных байтов - в 10. Оставшиеся Свободные места этих N байт заполняются символами. Юникода, старший бит заполняется 0. Подробности смотрите в таблице ниже:

Номер Юникода

Кодировка UTF-8

1-й байт

2-й байт

3-й байт

Байт 4

0x00000000~0x0000007F

0xxx xxxx

0x00000080~0x000007FF

110x xxxx

10xx xxxx

0x00000800~0x0000FFF

1110xxxx

10xx xxxx

10xx xxxx

0x00010000~0x0010FFFF

1111 0xxx

10xx xxxx

10xx xxxx

10xx xxxx

При декодировании смотрите на первый байт

Начиная с 0: декодирование одного байта;

Начиная со 110: двухбайтовое декодирование;

Начиная с 1110: трехбайтовое декодирование;

Начиная с 11110: четырехбайтовое декодирование;

В Кодировке UTF-8 китайские иероглифы обычно занимают три байта.

3. BOM

Byte Order Марк, мы можем видеть такие вещи, как «Кодирование» в опции «Кодировка» в Notepad++. in UTF-8 и кодировка in Такие опции, как UTF-8-BOM, с тегами или без них, не повлияют на декодирование символов, если поставить Кодировку без тегов. UTF-8 преобразуется в тегированное кодирование UTF-8-BOM, и ни программа, ни китайские комментарии не будут искажены, но между ними есть разница. Например наш часто используемый emWin, в emWin китайский язык поддерживает только Кодировку без тегов UTF-8,При использовании тега UTF-8-BOM,Хотя об ошибке не будет сообщено,Но в контроле,Эти китайские иероглифы не могут быть отображены.

5. Кодировка ANSI

Кодирование ANSI — это термин в Windows.,Подобно GBK и GB2312, все они имеют кодировку ANSI.,в разных языковых операционных системах,кодирование, представленное ANSI, отличается,Например, в китайском, тайском и французском языках есть свои способы произнесения кодирования.,Этикодирование Способверно Кодировка Расширением ASCII является ANSI.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose