Часто ли мы сталкиваемся с такими проблемами во время разработки?,Например, если вы создаете проект в VS2019,Внутри есть программы на языке C и китайские комментарии.,один день,По потребностям работы,Вам необходимо пересадить некоторые файлы C и H в проект Keil.,При копировании и вставке соответствующих файлов в проект Keil,и при открытии с помощью MDK,Но нашел,Файл, который вы пересадили в программу на языке Си, отображается нормально.,Но китайский превратился в кучу искаженных иероглифов.,А при компиляции выскакивают разные необъяснимые ошибки. На самом деле это может быть связано с тем, что ваши VS2019 и Keil используют разные методы кодирования.,Потому что большинство кодировок совместимы с Кодировка ASCII., тогда как программа на языке C использует английские символы, используя Кодировку ASCII,Так что отображается нормально,Китайское кодирование другое.,Например, тот же 0xB0A1 в Память,Используйте разные стандарты кодирования для декодирования 0xB0A1.,Вы можете получить разные китайские иероглифы.
В компьютерном мире есть только два числа: 0 и 1. Будь то английские, китайские или цифры, все они хранятся в компьютере в виде 01. Следовательно, если вы хотите сохранить текст на компьютере, вам необходимо указать определенную последовательность 01 для представления текста. Кодирование — это процесс указания конкретной последовательности 01 для представления текста. Кодирование представляет собой форму хранения символов в компьютере.
Символы, цифры, английские буквы, изображения, видео, аудио и т. д., которые мы часто видим в компьютерах, хранятся в компьютерах в двоичной форме, поскольку карты памяти состоят из электронных компонентов и имеют только высокую электрическую мощность. Их два. состояния флэта и низкого уровня, а именно два значения 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 в компьютере.
Тип данных — это псевдоним блока памяти фиксированного размера, который описывает диапазон размеров данных, которые может представлять эта память; Набор символов определяет соответствие между текстом и двоичным кодом и присваивает каждому тексту уникальный номер «один к одному». Кодировка символов определяет, как текстовые числа хранятся в компьютере.
кодирование в 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.
Английскую кодировку можно заменить алфавитной, поскольку все английские слова можно разбить на комбинации из 26 английских букв. Но китайский иероглиф - это целое, и его можно закодировать только одним символом. Если для кодирования используются только 8-битные коды ASCII, этого явно недостаточно. представляют. Существует 256 китайских символов, поэтому существуют следующие методы китайского кодирования.
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 |
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 |
Кодировка GB18030: использует 4-байтовую кодировку, совместимую с ASCII, GB2312 и GBK. Включая GB18030-2000, скомпилированную в 2000 году, и GB18030-2005, скомпилированную в 2005 году.
Big5кодирование: в основном используется на Тайване, в Гонконге и других местах.,В основном включает в себя традиционные китайские иероглифы. Что касается количества китайских иероглифов, которые он содержит.,Big5 — это разновидность GBK.,Но способ кодирования между ними различен.,Например, тот же «ах»,GBKкодирование — 0xB0A1.,Big5кодирование — 0xB0DA.
В каждой стране и регионе свой набор текстов.,В разных системах письма используются разные стандарты кодирования.,Это поднимает вопрос,Одно и то же двоичное кодирование может представлять разные символы в разных стандартах кодирования.,Например 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 и т. д.
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. |
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 байта.
Формат преобразования 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 китайские иероглифы обычно занимают три байта.
Byte Order Марк, мы можем видеть такие вещи, как «Кодирование» в опции «Кодировка» в Notepad++. in UTF-8 и кодировка in Такие опции, как UTF-8-BOM, с тегами или без них, не повлияют на декодирование символов, если поставить Кодировку без тегов. UTF-8 преобразуется в тегированное кодирование UTF-8-BOM, и ни программа, ни китайские комментарии не будут искажены, но между ними есть разница. Например наш часто используемый emWin, в emWin китайский язык поддерживает только Кодировку без тегов UTF-8,При использовании тега UTF-8-BOM,Хотя об ошибке не будет сообщено,Но в контроле,Эти китайские иероглифы не могут быть отображены.
Кодирование ANSI — это термин в Windows.,Подобно GBK и GB2312, все они имеют кодировку ANSI.,в разных языковых операционных системах,кодирование, представленное ANSI, отличается,Например, в китайском, тайском и французском языках есть свои способы произнесения кодирования.,Этикодирование Способверно Кодировка Расширением ASCII является ANSI.