Наборы символов и кодировки

задняя часть

Вкладки (разделенные пробелом): Общие


Примечание. Эта статья относится к этому столбцу набора символов Zhihu.Вникаем в программирование, Большинство идей в этой статье взяты из этой серии статей.Если у вас есть хорошие вещи, вы должны ими поделиться, но это относительно долго и содержание не очень понятно, но описание очень полное.Вы хотите узнать об этом больше Вы можете прочитать в этой колонке (я думаю, что это действительно полезно и надеюсь вознаградить одноклассника, который создал эту серию статей).

что такое персонажи

字符Есть два вида, один называется可见字符, называется不可见字符.

Как следует из названия,可见字符Это символы, которые можно увидеть после печати. Напримерa,b,,,... ТакойОтдельный национальный символ, знак препинания, графический символ, цифра и т. д., видимые человеческому глазу, называются可见字符.

不可见字符Тоже легко понять, т. е. когда принтеру или печати символов в черном ящике иногда нужно переносить строку, набирать табуляцию или что-то еще, или отсылать символ при выводе определенного символаС треском такие вещи мы не можем видеть, простоСимвол для управления выходным эффектом называется不可见字符.

Уведомление,Все персонажи одиноки 😯!. объединить символы字符串,Напримерabcэтоa,b,cодин из трех персонажей字符串.

набор символов

字符集буквально означает字符的集合. ноупоминается в компьютерной системе字符集относится к упорядоченному набору пронумерованных символов.

Подчеркнем здесь два момента:

  1. пронумерован

    Мы будем нумеровать каждый символ в наборе символов, скажем, вASCII字符集, мы даем заглавные буквыAНет65, давая открывающую скобку{Нет123.

    Кроме того, разные наборы символов могут нумероваться по-разному. Заметьте, я сказал возможно! Например, если вы сами придумываете набор символов, ставьте заглавные буквыAНет111Тоже можно, но к собственному определению никто не подпускает😯.

  2. отсортированный набор

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

    Также, чтобы подчеркнуть集合. То есть разные字符集Включенные символы могут быть разными. НапримерASCII字符集содержит 128 символов, аGB2312字符集Он содержит 7445 символов.

модель кодирования символов

Один字符集От рождения до фактического использования компьютера он примерно состоит из следующих 5 шагов:

  1. Явно содержат диапазон символов.

    Этот шагКонечно字符集какие символы должны быть включены в. НапримерASCII字符集128 символов включены, в то время какGB2312字符集Содержит 7445 символов.

  2. дать шаги1Символы, указанные в, пронумерованы.

    Для символов, которые были определены в символах, придумайте средствоСоздание однозначного соответствия между символом и числом.

    так какASCII字符集Символов меньше, всего 128, поэтому способ нумерации тоже простой и грубый, прямо указывайте по одному на каждый символ0~127числа, такие как ввод символовAНет65. Но более сложные наборы символов будут мягче, напримерGB2312字符集использовал区位码Способ нумерации символов, о том, как нумеруются различные наборы символов, мы поговорим позже.

    Специальное примечание: на этом этапе编号Это чисто математическое число, не имеющее ничего общего с памятью компьютера. со следующими шагами编码это два совершенно разных понятия! !

  3. двигаться по ступенькам2середина编号Конечно逻辑上的字符编码.

    Компьютеры могут понимать только двоичный код, и чтобы хранить символы в компьютере, вам нужно хранить символы编号Сопоставьте с двоичными данными. это сопоставлениеНекоторые напрямую отображают число в двоичные данные, а некоторые не могут напрямую отображать по некоторым причинам, а некоторые алгоритмы используются для вычисления двоичных данных, соответствующих числу.

    но в двоичном формате字符Эти вещи необходимо отметить:

    • Для двоичного текстового файла, сколько битов компьютер должен считывать за раз?

      компьютер字节(8 бит) является базовой единицей обработки, поэтому количество битов, считываемых за раз, должно быть кратно 8.

      Различные кодировки наборов символов имеют разные правила: некоторые считывают по одному байту за раз, некоторые считывают по 2 за раз, а некоторые считывают по 4 за раз. мы кладемБайты, которые компьютер считывает за раз, называются编码单位(английское названиеCode Unit),Также известен как码元.

    • Персонаж должен учитывать несколько码元Шерстяная ткань?

      такие как взятиеASCII字符集Например, он содержит всего 128 символов,ASCII编码указывает 1 байт как 1码元,такASCII字符集Один码元может изображать персонажа.

      Но есть некоторые методы кодирования码元Он может занимать несколько байтов, а также различается количество включаемых символов.字符集Подробно ответим на этот вопрос при использовании метода кодирования.

    逻辑字符编码означаетпоставить шаги2Номер символа в сопоставляется с двоичным числом и указывается правильно码元размер. так字符может быть выражен в виде одного или нескольких码元Упорядоченные двоичные числа, мы называем их码元序列. Иногда для простоты кладут逻辑字符编码просто упоминается как编码.

    Для того же набора символов, поскольку из编号Способ сопоставления с двоичными данными отличается или принят码元различные размеры,Один и тот же набор символов может также иметь несколько кодировок..

  4. дать шаги3Логическая кодировка символов, определенная в, генерирует физическую кодировку символов.

    для шагов3Определенное двоичное число, не зависящее от платформы конкретной компьютерной системы.逻辑意义上的编码, то так называемый物理上的字符编码этоболее конкретное кодирование, связанное с конкретной платформой компьютерной системы.

    Это в основном для码元это случай нескольких байтов,码元Для одного байта можно считать, что шаг 3 и шаг 4 совпадают. Порядок расположения байтов может зависеть от различных систем. Мы говорим о мультибайте ниже码元Внимательно отнеситесь к этому вопросу при кодировании.

    Физически закодированная двоичная последовательность, которую мы называем字节序列. Конечно,большую часть времени码元序列и字节序列значение такое же.

  5. Для нижнего уровня компьютера выполняется дальнейшая обработка адаптивного кодирования.

    В этой части речь идет о том, как оптимизируется компьютерное железо, нам не нужно разбираться в этом, но из вежливости мы все равно должны его скопировать (в общем, включая два типа):

    • Один из них — сопоставить последовательность байтов с более ограниченным диапазоном значений, чтобы соответствовать ограничениям среды передачи, таким как кодировка Base64 для передачи по электронной почте или кодировка с кавычками для печати (кодировка ссылок на печатные символы), обе из которых равны 8. Байты битов отображаются в 7-битные данные (протокол электронной почты предназначен для передачи только 7-битных символов ASCII);

    • Другой - это значение сжатой последовательности байтов, например LZW или кодирование длины процесса и другие методы сжатия без потерь.

Важно отметить, чтомы обычно называем это编码, если понимать как глагол, может быть этапом выполнения3, и, возможно, шаги3и шаги4Выполнять вместе; также может быть шагом, если понимать его как существительное3После выполнения символа, соответствующего码元序列, и, возможно, шаги4реализован фактический字节序列. это编码Значение слова нужно понимать в контексте, но编码и编号Разница очевидна! !.

Модель кодирования для определенных наборов символов

Набор символов ASCII

Мы знаем, что компьютер был изобретен в Соединенных Штатах 🇺🇸.ASCIIозначаетAmerican Standard Code for Information Interchange, что переводится как:美国信息交换标准代码.

  1. Включить диапазон символов 只收录了128个字符,具体是哪些后边会有一张图展示。

  2. номер символа американский старик0~127Пронумерованы 128 символов, из которых:

    • они положили0~31а также127Используемые для специальных целей, эти символы не могут быть напечатаны, то есть мы их не видим, поэтому они называются不可见字符или控制码.

      Например10, что означает новую строку. Когда этот символ встречается в программе, он будет выводиться на новой строке, например7, означает вибрацию.Если мы выведем этот символ прямо в программе, то программа издаст звуковой сигнал🔊.

    • затем используйте32~126для описания пробелов, знаков препинания, цифр, прописных и строчных букв.

      Например65используется для обозначения заглавной буквы «А»,123для представления открывающей скобки{.

  3. Логическое кодирование

    Усыновленныйодин байт как码元Размер числа просто и грубо отображает число в двоичные данные.

    Например, мы просто набираем строку из английских букв (включая 3 английских символа):

    LMN
    

    Мы можем найти:

    L 对应 76 (二进制数是:1001100)
    M 对应 77 (二进制数是:1001101)
    N 对应 78 (二进制数是:1001110)
    

    из-за другого码元Это байт (8 бит), если 8 бит не хватает, то заполняется в старшем разряде.0. такLMNЭтот текст следует закодировать следующим образом (для удобства всех я добавил пробел между каждым байтом, которого на самом деле нет):

    01001100 01001101 01001110
    

    Затем компьютер будет разделять на 8 бит при чтении этой строки двоичных данных, поэтому解码Процесс:

    • прочитай сначала01001100, определить, что этоLперсонаж.
    • прочитать еще раз01001101, определить, что этоMперсонаж.
    • прочитать еще раз01001110, определить, что этоNперсонаж.

    Итак, прочитав эту строку двоичных данных, ее можно отобразить на дисплее.LMN. Двоичный код не дружелюбен к людям и слеп.Приведенный выше двоичный код преобразуется в шестнадцатеричный следующим образом:4c4d4e

  4. физическое кодирование

    Так как это однобайтовая кодировка, то字节序列и码元序列это то же самое.

На картинке нижеASCII字符集Полное изображение высокой четкости, вы можете увидеть, какой символ представляет каждое число:

image_1bqi8qm43m71krg1gags7o1lhc9.png-455.4kB

Обратите внимание, обязательно различайте следующие два понятия:

  • ASCII字符集: это принести编号коллекция персонажей.
  • ASCII编码: На самом деле это对ASCII字符集中的字符按照编号进行编码сокращенное наименование.
Набор символов серии ISO 8859

Обратите внимание, что мы используемрядЭто слово означает, что на самом деле существует много наборов символов.

На самом деле набор символов серии ISO 8859 включает 15 наборов символов, а именно ISO 8859-n, где n=1,2,3,...,15,16 (12 из них не определены, всего 15) . Причина, по которой эти 15 наборов символов собраны вместе, заключается в том, что, по сути, все ониASCII字符集расширение . За исключением того, что включенные символы несколько отличаются, другие методы кодирования такие же.

  1. Включить диапазон символов КромеASCII字符集Каждый набор символов был расширен на 96 символов в дополнение к символам, содержащимся в .

  2. номер символаASCII字符集Номера символов в160~255число в этом диапазоне.

  3. Кодирование (логическое кодирование и физическое кодирование одинаковы, они объединены)

    Так как количество символов по-прежнему не более 256, то все равно нравитсяASCII字符集Подобно кодированию, использованиеодин байт как码元Размер числа просто и грубо отображает число в двоичные данные. из-за иASCII字符集Метод кодирования тот же, и здесь нет примера.

существуетISO 8859系列字符集, мы часто используемISO 8859-1этот набор символов, этот набор символов большеASCII字符集Он включает в себя некоторые часто используемые символы в Западной Европе (в том числе буквы Германии и Франции).ISO 8859-1字符集Существует также псевдоним, называемыйLatin-1. взгляните нижеISO 8859-1字符集Кодировка всех символов включена:

image_1bqpf8oa010uv1pas81t1hqf139tm.png-215.4kB

这个`ISO 8859系列字符集`中各个字符集不同的地方就是比`ASCII字符集`多收录的94个字符是不一样的,下边我们大致列举一下除`ISO 8859-1字符集`之外的字符集多收录的这94个字符是什么字:

ISO 8859-2字符集,也称为Latin-2,收录了东欧字符;
ISO 8859-3字符集,也称为Latin-3,收录了南欧字符;
ISO 8859-4字符集,也称为Latin-4,收录了北欧字符;
ISO 8859-5字符集,也称为Cyrillic,收录了斯拉夫语系字符;
ISO 8859-6字符集,也称为Arabic,收录了阿拉伯语系字符;
ISO 8859-7字符集,也称为Greek,收录了希腊字符;
ISO 8859-8字符集,也称为Hebrew,收录了西伯莱(犹太人)字符;
ISO 8859-9字符集,也称为Latin-5或Turkish,收录了土耳其字符;
ISO 8859-10字符集,也称为Latin-6或Nordic,收录了北欧(主要指斯堪地那维亚半岛)的字符;
ISO 8859-11字符集,也称为Thai,从泰国的TIS620标准字符集演化而来;
ISO
8859-12字符集,目前尚未定义(未定义的原因目前有两种说法:一是原本要设计成一个包含塞尔特语族字符集的“Latin-7”,但后来塞尔特语族变成了ISO 8859-14 / Latin-8;二是原本预留给印度天城体梵文的,但后来却搁置了);
ISO 8859-13字符集,也称为Latin-7,主要函盖波罗的海(Baltic)诸国的文字符号,也补充了一些被Latin-6遗漏的拉脱维亚(Latvian)字符;
ISO 8859-14字符集,也称为Latin-8,它将Latin-1中的某些符号换成塞尔特语(Celtic)的字符;
ISO 8859-15字符集,也称为Latin-9,或者被戏称为Latin-0,它将Latin-1中较少用到的符号删除,换成当初遗漏的法文和芬兰字母,还把英镑和日元之间的金钱符号,换成了欧盟货币符号;
ISO 8859-16字符集,也称为Latin-10,涵盖了阿尔巴尼亚语、克罗地亚语、匈牙利语、意大利语、波兰语、罗马尼亚语及斯洛文尼亚语等东南欧国家语言。
Набор символов GB2312

Ненавистные империалисты США не учли чувств китайского народа и народов третьего мира, когда они пользуются компьютерами. Поэтому китайские ученые-компьютерщики решили сами разработать набор символов.

  1. Включить диапазон символов Он содержит китайские иероглифы, а также латинские, греческие, японские хирагану и катакану и русскую кириллицу. Среди них 6763 китайских иероглифа и 682 других иероглифа.

    Уведомление,GB2312字符集не записаноASCII字符集персонаж в о.

  2. номер символа так какGB2312字符集Включено слишком много символов, поэтому жестокая нумерация неудобна, поэтому я предлагаю分区Концепция чего-либо. Как на картинке ниже:

    image_1bqjvij2mipa1oeh12781i1t92d2a.png-43.6kB

    Как показано выше, каждый желтый овальный блок может представлять分区, именуемый. Всего было разработано 94(01-94), 94 можно разместить в каждой области字符(01-94).

    Следовательно, способ найти символ состоит в том, чтобы найти первый символ в первом разделе. например китайские иероглифы, слово помещается в 1-ю позицию 16-й области, поэтомуСоответствующий номер1601. Потому что он разделен по количеству первого района, он также называется区位码, Мы можем сказатьсоответствует слову区位码да1601.

    其实所谓的`区`和`位`,本质上和`行`和`列`是一样一样的。
    
    一个分区就代表一行,一位就代表一列。第几区第几位的意思就是第几行第几列。
    

    который分区Какие символы ставить оговорено, а некоторые разделы ничего не ставить, поэтому они пустые. Какие символы хранятся в каждом разделе:

    01-09Область является специальным символом, а символы включают в себя специальные символы, цифры, английские символы, табуляции и т. д., в том числе латинские буквы, греческие буквы, японские буквы хирагана и катакана, русские буквы кириллицы и т. д.

    • 10-15Область не имеет кодировки и расширяется для последующего добавления новых символов.

    • 16-55Область — это китайские иероглифы первого уровня, то есть общеупотребительные китайские иероглифы, отсортированные по пиньинь.3755Кусок.

    • 56-87Площадь представляет собой китайский иероглиф второго уровня, то есть очень используемый китайский иероглиф, отсортированный по радикалу/штриху, всего3008Кусок.

    • 88-94Площадь не закодирована и зарезервирована для будущего расширения.

    Поскольку слишком много персонажей не могут быть полностью выражены, поэтому часть перехвата для всеобщего обозрения:

    image_1bqk0c7l31v891a8t9408vluqh2n.png-226.6kB

    Если вы хотите проверить определенный китайский иероглиф区位码Или, чтобы просмотреть карту с полным кодом местоположения, вы можете перейти сюда:Запрос и преобразование кода города GB2312

  3. кодирование справаGB2312字符集Перед кодированием нам нужно столкнуться с этой проблемой:GB2312字符集не записаноASCII字符集Символы в , если в тексте встречается английская буква, как ее закодировать в двоичные данные.

    РазговаривалиGB2312编码На самом деле это означает две вещи:

    • если персонаж вASCII字符集, в соответствии сASCII编码способ кодирования.
    • если персонаж вGB2312字符集, в соответствии сGB2312编码способ кодирования.

    解码это编码обратный процесс.

    С приведенными выше инструкциями мы вернемся кGB2312字符集символы в编码тема о. Нашими первоначальными мыслями были:

    1. рисунокASCII字符集такой же, как метод кодирования, напрямую положитьGB2312набор символов编号, это,区位码действовать как编码.

      возьми мою фамилиюДля каштанов,Слово 85-й в 45-м округе, код места4585, преобразованный в двоичный файл:

      10001 11101001
      

      Если он представлен двумя байтами, это:

      00010001 11101001
      

      Но когда компьютер читает эту строку двоичных данных, например, он читает первый байт00010001(десятичное17), как он различает эточасть кодировки слова илиASCII编码Первое17А как насчет числового символа? Ответ заключается в том, что нет никакой разницы.

      но мы знаемASCII编码Только один байт0~127,один из них128~255не используется, поэтому мы даем编码После добавления каждого байта128(Двоичный это10000000), так что ни один байт меньше, чем128ситуация! пытаться:

          00010001
      +   10000000
      ____________
          10010001
      
          11101001
      +   10000000
      ____________
          01101001(进位舍去)
      

      старший байт00010001добавлять128Без проблем, но низкий байт11101001добавлять128После большой проблемы, они и более255, поэтому мы можем только округлить перенос, а результат ниже, чем128ценность.

      Очевидно, что каждый байт напрямую добавляется таким образом.128Все равно ненадежно. потому что мы не можем гарантировать, что каждый байт будет иметь значение меньше, чем128, поэтому нет гарантии, что добавленная сумма меньше или равна255.

      Для решения этой проблемы мы предлагаем другое решение:

    2. Не напрямую区位码карты на编码, при этом код города обрабатывается как один байт, а номер бита — как другой байт. такномер слова4585Это можно рассматривать как45и85, затем поставьте45и85Соответственно, в байт:

      00101101(十进制45)
      01010101(十进制85)
      

      Соединить:

      00101101 01010101
      

      Но это все еще имеет иASCII编码непонятная проблема. Итак, вам нужно добавить каждый байт127: 45 + 127 = 172 (двоичный10101100); 85 + 127 = 212 (двоичный11010100);

      Таким образом, результат сплайсинга:

      10101100 11010100
      

      Этот вид сборки не имеет и больше, чем255ситуация? Не забывайте, как генерируются наши два байта, значение каждого байта на самом деле является кодом области или битовый номер. Ранее мы говорили, что у нас есть в общей сложности 94 областей, и каждая область имеет максимум 94 символа, поэтому максимальное значение байта составляет 94.94и128Сумма точно не превысит255ах~

    3. Считаете ли вы, что верхняя часть является окончательной версией кодирования? Нисколько.

      Поскольку диапазон кода города1-94Между ними битовый код также1-94между. Так согласно теории, просто дайте код города, добавлен битовый код127~161Интервала можно избежать иASCII编码конфликт.Но в итоге решил区码и位码оба добавляют160.

      为什么是160呢?
      
      我都说了在`127~161`的数都可以,不信你试试。
      

      Окончательный вывод заключается в том, чтоGB2312编码процесс заключается в区位码Код города и битовый код добавляются160затем прописан на два байта.

      Напримерномер слова4585, ставить45и85Оба добавляют 160:

      45 + 160 = 205 (二进制`11001101`)
      85 + 160 = 245 (二进制`11110101`)
      

      Таким образом, окончательный код, который прописан:

      11001101 11110101
      

      В преобразованном виде в шестнадцатеричном виде это выглядит так:

      CDF5
      

    Наконец, подводя итог: так называемаяGB2312编码Он состоит из двух частей:

    • если персонаж вASCII字符集, в соответствии сASCII编码способ кодирования.
    • если персонаж вGB2312字符集, в соответствии сGB2312编码способ кодирования.

    заGB2312中的字符进行编码是这个过程:

    把`区位码`的区码和位码都加`160`,然后拼成两个字节
    

    解码процесс выше编码обратный процесс.

    Чтобы дать полный каштан, например, у нас есть этот текст:

    我爱u
    

    затем используйтеGB2312编码Процесс кодирования этого текста:

    • Соответствующий код города4650Шестнадцатеричный кодCED2, который является двоичным:1100111011010010.

    • Соответствующий код города1614закодированный шестнадцатеричныйB0AE, который является двоичным:1011000010101110.

    • uдаASCII字符集характер, после кодировки75, двоичный файл:01001011.

    • Объединенный результат:

      1100111011010010101100001010111001001011
      

      Шестнадцатеричное представление этой строки битов:CED2B0AE4B.

    затем компьютер解码Процесс этих двоичных данных:

    • прочитать байтCE, найти, что он больше, чем127, значит это двухбайтный символ, поэтому два байта читаются подрядCED2, нашел в кодовой таблице, что это китайский иероглиф.
    • Затем прочитайте еще один байтB0, найти, что он больше, чем127Так что два последовательных байта читаютB0AE, нашел в кодовой таблице, что это китайский иероглиф.
    • Затем прочитайте еще один байт4B, найти, что он меньше127, так что в таблице кодов ASCII обнаруживается, что это английский алфавитu.

    栗子讲完了。 так какGB2312Есть слишком много персонажей, включенных в набор символов, поэтому я только немного покажу, все хорошо понимают:

    image_1bqjlgvd3rv11jo21p0g1ni0115b13.png-37kB

    всеGB2312Вы можете обратиться к набору символовGB2312 Упрощенная китайская кодовая таблица

GBKиGB18030набор символов

имеютGB2312Мы довольны, но не задолго до того, как мы обнаружили, что слишком много китайских иероглифов, и даже бывшая китайская премьер-премьер Чжу Ронгджи «Ронг» не включен.

GBKНабор символов естьGB2312На основе21886Китайские иероглифы и графические символы.

GB18030набор символов вGBKНа основе , было сделано расширение для включения китайских иероглифов70244Кусок.

И ихGB2312Он принадлежит к тому же предкам, и не вносит свою модель кодирования персонажей ~

Big5набор символов

Также известная как Большая пятерка или Большая пятерка, она была основана Acer, MiTAC, Allison, Zero One и FIC, поэтому ее называют Большой пятеркой. Его изобрел тайваньский одноклассник. Нам не нужно понимать конкретную модель кодирования символов.

набор символов юникода

Такое определение мира, как Китай字符集Есть много стран, поэтому люди всех стран обсудили его, выпустить файл, называемыйThe Unicode Standard, этот документ утратил силуASCII字符集Все наборы символов, кроме , определяют общий для всех набор символов, то естьUnicode字符集.

  1. Включить диапазон символов Содержит всех мыслимых персонажей на земле и постоянно расширяется.

  2. номер символа Поскольку включено слишком много символов, а новые символы могут добавляться непрерывно, принудительная нумерация явно неудобна в управлении. такUnicode字符集Дизайнеры предложили平面(английское названиеPlane)Концепция чего-либо.

    image_1bqrccs35sqp8ki1pjn1o8h1o929.png-29.2kB

    Всего 17 (пронумеровано от0~16) Самолеты, каждая плоскость может содержать 65536 (0~65535) номер. Диапазон номеров каждой плоскости показан на следующем рисунке (в шестнадцатеричном представлении):

    image_1bqrd0pd41um41c0du4jccphnam.png-110.8kB

    Среди 17 плоскостей в этом дизайне нулевая плоскость содержит некоторые из наиболее часто используемых символов в мире. Итак, этот 0-й план также называетсяBMP(АнглийскийBasic Multilingual Planeаббревиатура), что переводится как基本多语言平面.它是我们最经常用到的。

    Мы говорим о некоторыхunicode字符集Нумерация символов в обычно используется следующим образом:

    U+十六进制编号
    

    Возьми каштан,Шестнадцатеричный номер слова738B, поэтому пишем:

    U+738B
    

    этоU+738Bпредставляетunicode字符Число.

    Кроме того,unicode字符集номер совместим сASCII字符集номер иISO 8859-1字符集номер.unicode字符集серединаU+0000~U+007F(т.е. 0~127 в десятичном формате) иASCII字符集согласуется,U+0000~U+00FF(т.е. десятичные числа от 0 до 255) иISO 8859-1字符集(набор символов Latin-1) также соответствует. такие как заглавные буквыAЦифры65, открывающая скобка{Цифры123.

    На скриншоте ниже перечислены некоторые китайские иероглифы.unicodeЧисло, обратите внимание, что используйте шестнадцатеричное представление:

    image_1bqkqqp40elm6981jqm1q2c6109.png-419.4kB

  3. логическое кодирование Чтобы решить проблему сначала, многие люди думают, чтоunicode字符集Это метод кодирования сам по себе, который занимает 2 байта Это утверждение неверно.字符集и编码方式это два совершенно разных понятия. что мы обычно говоримunicode值относится к персонажу编号, вместо编码.

    Когда дело доходит до кодирования, нужно еще раз подчеркнуть码元концепция, мы говорим码元Размер — это размер в байтах, который компьютер считывает за раз.

    даватьunicode字符集при кодировании码元Существует три случая размера: 1 байт, 2 байта и 4 байта.Соответствующие методы кодирования:UTF-8,UTF-16,UTF-32Эти три анализируются отдельно ниже:

    1. Схема логического кодирования UTF-8

    эта схема кодирования码元Занимает один байт. Но байт может представлять только до 256 символов, поэтому для представления некоторых символов требуется несколько байтов, но это создает проблему: как компьютер различает, какой символ представлен码元(здесь 1 байт) указывает, какой символ использует несколько码元указано?

    UTF-8编码Первые несколько битов первого байта используются для определения того, сколько байтов используется для кодирования:

    • Если первый байт начинается с 0, это должна быть однобайтовая кодировка (один элемент кода);

    • Если первый байт начинается со 110, это должна быть двухбайтовая кодировка (2 символа);

    • Если первый байт начинается с 1110, это должен быть трехбайтовый код (3 символа).

      ... И так далее

    Кроме того, если символ кодируется несколькими байтами, за исключением первого байта, остальные байты должны начинаться с 10, чтобы различать первый байт кодирования интерпретации одного слова и многобайтового кодирования.

    0,110,1110 инициалов и старшего байта 10 соответствует каждому байту префикса кодировка UTF-8, т.н.前缀码. Среди них 0 в префиксных кодах 110, 1110 и 10 — это 0 в префиксном коде.终结标志. Эти前缀码Он используется только для маркировки, а не для представления реального номера символа. Так что на самом деле очень эффективно представлятьunicode字符Фактическое количество цифр для номеров символов:

    • Эффективное количество закодированных битов в одном байте равно 7 битам (исключая префикс первого байта 0).

    • Эффективное количество закодированных битов в двойном байте равно 11 (за исключением префикса 110 первого байта и префикса 10 второго байта).

    • Эффективное количество закодированных битов в трех байтах равно 16 битам (исключая префикс 1110 первого байта и префикс 10 второго и третьего байтов).

      ... И так далее

    Вот как это выглядит в таблице:

    описывать Эффективное количество битов кода старший байт низкий байт младший байт младший байт младший байт
    однобайтовое кодирование 7 0xxxxxxx
    двухбайтовое кодирование 11 110xxxxx 10xxxxxx
    3-байтовая кодировка 16 1110xxxx 10xxxxxx 10xxxxxx
    4 байтовое кодирование 21 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    5-байтовая кодировка 26 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    ...

    Итак, у нас естьunicode字符При кодировании вы можете сделать это:

    • Посмотреть этоunicode字符Соответствующее количество цифр, чтобы увидеть, сколько байтов оно должно быть закодировано.

    • Выбрав несколько байтов для кодировки, используйте шаблон в таблице выше, сохраните префикс без изменений, заполните номер символа в Bit Prefix, и заполните высокий бит с 0.

    Возьмите каштан, например, персонажu, его процесс кодирования:

    • uизunicode编号да117(двоичный1110101), занимая 7 бит, поэтому достаточно кодирования 1 байтом.
    • Используйте 1-байтовые закодированные шаблоны0xxxxxxx, положите внутрьxxxxxxзаменить1110101Достаточно.

    такuперсонажUTF-8Результат кодирования:

    01110101
    

    Это как китайские иероглифы, его процесс кодирования:

    • изunicode编号是21834(二进制101010101001010`), который занимает 15 бит и должен быть закодирован 2 байтами.

    • Поэтому используйте 3-байтовый шаблон кодирования1110xxxx 10xxxxxx 10xxxxxx, Двоичные данные для заполнения, старшие 0.

    такперсонажUTF-8В результате получается кодировка (пробел между байтами читается нам в помощь, на самом деле нет, не подчеркивайте это внизу):

    11100101 10010101 10001010
    

    В дружественной шестнадцатеричной системе счисления это:

    E5958A
    
    2. Схема логического кодирования UTF-16

    эта схема кодирования码元Занимает 2 байта.

    мы знаемunicode字符集Базовая многоязычная плоскость (то есть 0-я плоскость), диапазон номеров: 0 ~ 65535 (шестнадцатеричный:0xFFFF). Диапазон номеров оставшихся 16 плоскостей (1~16 плоскостей): 65536~1114111 (шестнадцатеричное:0x10000~0x10FFFF).

    Но 2 байта могут представлять только до 65536 символов, поэтому двухбайтовый码元Вы можете напрямую представлять только количество основных многоязычных планов, поэтому вам нужно использовать несколько символов, которые представляют остальные 16 планов.码元. такUTF-16编码方案иUTF-8编码方案Вроде, у нас будет эта проблема:

    计算机如何区分哪个字符是用一个`码元`(此处是2字节)表示,哪个字符使用多个`码元`表示的?
    

    UTF-16Предложенный А.代理区концепция для решения этой проблемы.

    они предусматриваютБазовая многоязычная квартира56320 ~ 57343(шестнадцатеричный0xDC00 ~ 0xDFFF) Этот интервал пронумерован как代理区Номер этого раздела не соответствует символам..

    имеют代理区После концепцииUTF-16Предлагаемое полное решение:

    1. Поскольку базовый многоязычный план (то есть 0-й план) не принадлежит代理区Кодированные символы с использованием блока кода (2 байта) число непосредственно сопоставлено на кодировку символов.

    2. Для плоскостей с 1-й по 16-ю для кодирования используются два символа, а конкретный принцип кодирования заключается в следующем.

      • Диапазон значений первого символа0xD800~0xDBFF(двоичный файл11011000 00000000 ~ 11011011 11111111, в десятичном виде55296 ~ 56319),

        Второй символ диапазона0xDC00~0xDFFF(двоичный файл11011100 00000000 ~ 11011111 11111111, в десятичном виде56320 ~ 57343).

      • По диапазону единицы кода, определенному на предыдущем шаге, можно получить его двоичное представление:110110pp ppxxxxxx 110111xx xxxxxxxxВидно, что его эффективных кодовых разрядов всего 20, из которых 4 —ppppПредставляет плоскость, на которой расположен код (1~16), 16 бит.xxxxxxxxxxxxxxxxпредставляет положение на плоскости.

      Тогда 20 бит эффективных закодированных цифр могут представлять всего 2 в 20-й степени, то есть 1048576 кодов, которые просто представляют все 16 символов плоскости.

    Посмотрите, как персонаж нижеuпровестиUTF-16кодирование:

    1. uперсонажunicode编号да117(двоичный1110101), это число меньше65536, в базовой многоязычной плоскости, поэтому кодируется прямым преобразованием числа в кодировку, но码元Это два байта, поэтому старшие биты заполнены 0.

      персонажuизUTF-16Результат кодирования:

      00000000 01110101
      

      Уведомление:UTF-16Кодирование использует не менее 2 байтов, в результате чего0~127编号的字符也得用2个字节编码。 иUTF-8Требуется только 1 байт для кодирования0~127пронумерованные символы. такUTF-16в кодировании0~127нумерованные символы по сравнению сUTF-8напрасно тратить.

    посмотри сноваСлово каштан:

    1. Юникод номер21834(двоичный101010101001010), это число меньше65536, в базовой многоязычной плоскости, поэтому кодируется прямым преобразованием числа в кодировку, но码元Это два байта, поэтому старшие биты заполнены 0.

      персонажизUTF-16Результат кодирования:

      01010101 01001010
      

    Я приложил немало усилий, чтобы найти редкий китайский иероглиф.𨢻, чтобы увидеть его процесс кодирования:

    1. 𨢻Юникод номер166075(двоичный101000100010111011), это число не менее65536, во 2-м плане, так что переходим ко второму шагу разбираться.
    2. в соответствии с110110pp ppxxxxxx 110111xx xxxxxxxxЭто уравнение, как во второй плоскости, такppppСоответствующий двоичный файл0010, слово во второй плоскости60514(двоичный1110110001100010) бит, поэтомуxxxxxxxxxxxxxxxxМожет быть заменен1110110001100010.

    Итак, характер𨢻изUTF-16Результат кодирования:

    11011100 10111011 11011000 01100010
    
    3. Схема логического кодирования UTF-32

    эта схема кодирования码元Занимает 4 байта.

    потому что весьunicode字符集В настоящее время ассортимент кодирования 17 самолетов, каждая плоскость № 65536, поэтому в общей сложности1114112номер. 4 байта могут представлять4294967296число, поэтому с помощью одной единицы кода (4 байта) можно представить все числа.

    Напримерuперсонаж,uперсонажunicode编号да117(двоичный1110101), так прямо нумеруется:

    00000000 00000000 00000000 01110101
    

    посмотри снова𨢻характер, егоunicode编号是166075(二进制101000100010111011`), поэтому он имеет прямую нумерацию:

    00000000 00000001 01000100 010111011
    
  4. физическое кодирование Прежде чем говорить об этом, я должен представить字节序Концепция чего-либо.

    字节序(Byte-Order)этоОтносится к порядку байтов (байтов), в которых хранятся многобайтовые данные..

    Что вызвано多字节数据?多字节数据То есть, когда компьютер читает двоичные данные, он считывает за раз несколько байтов. Например, в типах данных, которые мы представили ранее в Java,shortчитать четыре байта за раз,intчитать четыре байта за раз,longЭто нужно прочитать 8 байтов за раз.short,intиlongтип данных多字节数据. Но, какbyteтип данных не多字节数据.

    Если все данные однобайтовые, не имеет значения, как они хранятся. Порядок байтов — это что-то на аппаратном уровне, что обычно прозрачно для программного обеспечения, но сейчас мы просто хотим объяснить, как его хранить..

    Допустим, мы определяем код в javaintШестнадцатеричное значение типа:

    int i = 0xaabbccdd; //二进制数据就是 10101010 10111011 11001100 11011101
    

    затем левый0xaa(10101010) является старшим байтом, конечно, этот уровень относителен, например0xbbи0xccПо сравнению со старшим байтом,0xccи0xddПо сравнению со старшим байтом,0xbbи0xddПо сравнению со старшим байтом.

    Теперь мы можем по переменнойiКак именно этот материал хранится в памяти?大端序(Big-Endian小端序(Little-Endian) сам.

    大端序(Big-Endian)этоСтарший байт хранится в младшем конце адреса, а младший байт хранится в старшем конце адреса.. Вот и все:

    image_1bqshe0rj20m16ep1ef41a5pi5113.png-17.1kB
    Это написано как:

    0xaabbccdd
    

    小端序(Little-Endian)этоСтарший байт хранится в старшем конце адреса, а младший байт хранится в младшем конце адреса.. Вот и все:

    image_1bqshkdma15l2m4g15qhgpa1i0q1t.png-16.6kB
    Это написано как:

    0xaabbccdd
    

    То есть, еслиiПорядок переменных в памяти0xaabbccdd, такой способ написания大端序.

    еслиiПорядок переменных в памяти0xddbbccaa, такой способ написания小端序.

    Если вы боитесь забыть, вы можете понять это так:

    `大端序`就是按照人类理解的顺序进行存储的,从左至右,从高字节到低字节。
    
    `小端序`就是按照反人类理解的顺序进行存储的,从左至右,从低字节到高字节。
    

    Некоторые операционные системы, такие как Windows, FreeBsd, Linux, используют обратный порядок байтов, некоторые операционные системы, такие как Mac OS, используют обратный порядок байтов.

    имеют大端序,小端序После понятия , давайте посмотрим на码元Конкретная разница в способе кодирования более одного байта:

    Кодировка UTF-16Be

    этоUTF-16логический код. То есть старший байт находится слева, а младший — справа.

    НапримерСловоUTF-16Be编码это:

    01010101 01001010
    

    Преобразуется в шестнадцатеричный вид:

    554A
    
    Кодировка UTF-16Le

    этоUTF-16Логическое кодирование小端序последовательность байтов. То есть старший байт находится справа, а младший — слева.

    НапримерСловоUTF-16Le编码это:

    01001010 01010101
    

    Преобразуется в шестнадцатеричный вид:

    4A55
    

    с вышеуказаннымUTF-16Be编码иUTF-16LeКодирование означает то же самое.

    Добавьте символ в заголовок файла, чтобы указать порядок байтов

    потому что это大端序и小端序Итак, используяUTF-16иUTF-32При кодировании нужно указать использование в начале текстового файла大端序все еще小端序. Укажите следующим образом:

    1. если大端序Кодировка, нужно добавить символ в начало файлаU+FEFF. Конечно,UTF-16编码Закодирует этот символ в 2 байта,UTF-32编码будет кодировать 4 байта.

    2. если小端序Кодировка должна добавить символ в начало файлаU+FFFE. Конечно,UTF-16编码закодирует этот символ в 2 байта,UTF-32编码будет кодировать 4 байта.

    Обратите внимание, что некоторые программы Windows, такие как Блокнот, используютUTF-8При кодировании он добавитU+FEFFсимвол, закодированное значение равно0xEFBBBF(шестнадцатеричный). ноUTF-8Порядок следования байтов отсутствует.Windows нечего добавить,и все это знают.Если вы используете блокнот для ввода кода и вызываете ошибку,подумайте о кодировке.

Суммировать

字符集и编码два понятия! ! ! ! ! ! ! ! ! ! Резюме закончилось.

буклет

Играя в рекламу, я написал книгу по mysql:Как работает MySQL ссылка. Содержание буклета в основном представлено с точки зрения Xiaobai, объясняя некоторые основные концепции ядра MySQL на относительно общем языке, такие как записи, индексы, страницы, табличные пространства, оптимизация запросов, транзакции и блокировки и т. д. Общее количество Words составляет около трех 400 000 слов с сотнями оригинальных иллюстраций. Основная цель состоит в том, чтобы облегчить обычным программистам изучение ядра MySQL и сделать кривую обучения более плавной. Студенты, которым это нужно, могут посмотреть

Не по теме

Я так устала!