Случайный разговор: Как объяснить своей девушке, что такое «Кунджинхао»?

Java задняя часть
Случайный разговор: Как объяснить своей девушке, что такое «Кунджинхао»?

Моя девушка ходила по магазинам на выходных, а я смотрел дома варьете один, и вдруг мне позвонила моя девушка.

Через некоторое время вернулась моя девушка, достала телефон и показала мне фотографии, сделанные в супермаркете:


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

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

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

В шпионской военной драме звуки «ди» и «ответ», которые превращают разведданные в телеграммы, в основномазбука Морзе, который представляет собой метод кодирования символов, выражающий разные английские буквы, цифры и знаки препинания в разном порядке расположения. Азбука Морзе состоит из коротких и длинных электрических импульсов, называемых точками и тире. Оговаривается временная длина точек и штрихов, при этом одна точка является базовой единицей, а один штрих равен длине трех точек. Это как раз соответствует «ди» и «ответу» телеграммы.

Точно так же, как телеграф может издавать только звуки «ди» и «ответ», компьютер распознает только два символа, 0 и 1. Однако существует много видов человеческих символов. Как преобразовать человеческие символы в символы 01, распознаваемые компьютерами? , этот процесс также требует кодирования символов.

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

Аналогично функции азбуки Морзе, в 1960-х годах в Соединенных Штатах был сформулирован набор кодов символов, которые единообразно оговаривали отношения между английскими буквами и двоичными битами.Это называется кодом ASCII, который используется до сих пор.

ASCII (Американский стандартный код для обмена информацией) — это компьютерная система кодирования, основанная на латинском алфавите. Он в основном используется для отображения современного английского языка, который имеет в общей сложности 128 символов, включая все прописные и строчные буквы, цифры от 0 до 9, знаки препинания и специальные управляющие символы, используемые в американском английском.

Так как ASCII имеет только 128 символов, хотя английские символы могут быть представлены, в мире есть много других символов, которые он не может представить, поэтому необходима более полная кодировка символов.

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

Unicode

Unicode (китайский язык: Universal Code, International Code, Unicode, Unicode) — это отраслевой стандарт в области компьютерных наук. Он упорядочивает и кодирует большинство систем письма в мире, облегчая компьютерам представление и обработку слов.

Юникод продолжает обновляться и по сей день, и в каждой новой версии добавляются новые символы. Последняя версия - 12.1, выпущенная в мае 2019 года. В этой версии добавлен только один новый символ, то есть лигатура японского новогоднего ордена.

Юникод широко признан и широко используется в процессе интернационализации и локализации компьютерного программного обеспечения. Существует много новых технологий, таких как Extensible Markup Language (XML), язык программирования Java и современные операционные системы, использующие кодировку Unicode.

Unicode — это универсальный набор символов, который содержит большинство символов мира, то есть Unicode может представлять китайский язык.

UTF-8 UTF-16 UTF-32

Хотя Unicode унифицирует кодировку символов во всем мире, он не указывает, как их хранить. Это делается с учетом:

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

Раз это оговорено, то перед каждой английской буквой должно быть два-три байта, что равно 0, потому что все английские буквы существуют в ASCII и могут быть представлены одним байтом, а остальные позиции байтов должны быть дополнены 0.

Если это так, размер текстового файла будет в два или три раза больше, что является огромной тратой памяти.Чтобы решить эту проблему, существуют некоторые наборы символов промежуточного формата, которые называются универсальным форматом преобразования или UTF (формат преобразования Unicode). Общие форматы UTF: UTF-7, UTF-7.5, UTF-8, UTF-16 и UTF-32.

UTF-8 использует от одного до четырех байтов для кодирования каждого символа.

UTF-16 использует два или четыре байта для кодирования каждого символа.

UTF-32 использует четыре байта для кодирования каждого символа.

Таким образом, мы можем сказать, что UTF-8, UTF-16 и т. д. — все это реализации Unicode.

Например, Unicode предусматривает, что Unicode, соответствующий китайскому символу «I», равен «\u6211», но в разных реализациях, таких как UTF-8 и UTF-16, метод хранения этого двоичного кода отличается.

UTF-8 использует байты переменной длины для хранения символов Unicode.Например, буквы ASCII по-прежнему используют 1 байт для хранения, символы с диакритическими знаками, греческие буквы или буквы кириллицы хранятся в 2 байтах, а обычно используемые китайские символы используют 3 символа.Фестиваль. Вспомогательные символы плоскости используют 4 байта.

ГБК, ГБ2312, ГБ18030

Поскольку UTF-8 является реализацией Unicode, он содержит кодировку всех символов мира, и он использует для кодировки 1-4 байта.

Для тех символов, которые включаются в первую очередь, для хранения может предпочтительно использоваться 1 байт или 2 байта, а для символов, включенных позже, для хранения используются 3 байта или 4 байта.

Именно потому, что он настолько полный, что те символы, которые включаются позже, могут занимать больше байтов в хранилище UTF-8, и его требования к дисковому пространству будут очень большими.

Для часто используемых китайских символов для кодировки в UTF-8 используется 3 байта, но если есть кодировка, содержащая только китайский язык и ASCII, нет необходимости использовать 3 байта, может быть, достаточно 2 байта.

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

Также исходя из этого соображения, Главное управление стандартов Китая сформулировало и внедрило кодировку GB 2312-80 в 1981 году, которая является национальным стандартом упрощенного китайского набора символов Китайской Народной Республики. Позже производитель Microsoft использовал неиспользуемое пространство кодирования GB 2312-80, чтобы включить все символы GB 13000.1-93 для разработки кодировки GBK.

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

Обычно используемые китайские коды: GBK, GB2312, GB18030 и т. д. Чаще всего используется GBK.

  • GB2312 (1980): 16-битный набор символов, включая 6763 упрощенных китайских символа, 682 символа, всего 7445 символов;

    • Преимущества: Он подходит для упрощенной китайской среды и соответствует китайскому национальному стандарту.Этот код также используется в материковом Китае, Сингапуре и других местах;

    • Недостатки: не совместим с традиционным китайским языком, а коллекция китайских иероглифов слишком мала.

  • GBK (1995): 16-битный набор символов, включая 21003 китайских символа, 883 символа, всего 21886 символов;

    • Преимущества: он подходит для среды, в которой сосуществуют упрощенный и традиционный китайский язык, используется упрощенной Windows, полностью совместим с gb2312 ниже и поддерживает международный стандарт ISO-10646 вверх, все символы могут быть сопоставлены с unicode2.0 один к одному;

    • Недостатки: он не соответствует официальному стандарту и нуждается в преобразовании между big5; многие поисковые системы плохо поддерживают китайские символы GBK.

  • GB18030 (2000): 32-битный набор символов, содержит 27 484 китайских иероглифов, а также тибетский, монгольский, уйгурский и другие основные языки меньшинств.

    • Преимущества: он может включать в себя все слова и символы, которые только можно придумать, соответствующие последним национальным стандартам Китая;

    • Недостаток: в настоящее время его поддерживает меньшее количество программного обеспечения.

искаженный

Давайте также возьмем пример телеграммы, представленной ранее, предполагая следующий сценарий:

Отправитель использует «американскую азбуку Морзе» для преобразования информации в телеграммы, а после того, как получатель получит телеграмму, он расшифрует ее с помощью «современной международной азбуки Морзе». Тогда полученный информационный контент может быть совершенно непонятным, что искажается.

Как и в компьютерной области, мы кодируем строку китайских иероглифов с помощью UTF-8 и передаем их другим.После того, как другие получают строку символов, они декодируют ее с помощью GBK, и получаемое ими содержимое будет «Кунжиикунджинцзяоцзяодай» Кунджин Као. Zhi Kunjin Kao Kun", это искаженный код.

Например, следующий код:

public static void main(String[] args) throws UnsupportedEncodingException {
    String s = "漫话编程!";

    byte[] bytes = s.getBytes(Charset.forName("GBK"));

    System.out.println("GBK编码,GBK解码:" + new String(bytes, "GBK"));

    System.out.println("GBK编码,GB18030解码:" + new String(bytes, "GB18030"));

    System.out.println("GBK编码,UTF-8解码:" + new String(bytes, "UTF-8"));
}

Выходной результат:

GBK编码,GBK解码:漫话编程!
GBK编码,GB18030解码:漫话编程!
GBK编码,UTF-8解码:????????

Видно, что китайские иероглифы кодируются GBK, а затем декодируются UTF-8, а полученные символы представляют собой строку вопросительных знаков, которая искажена.

Прошлая и настоящая жизнь Кун Джинкхао

Поскольку Юникод постоянно обновляется, в процессе должны появиться какие-то относительно новые символы, которые он не может представлять. Или даже если Unicode выпустит новую версию и включит в себя определенный символ, но многие программные системы не были обновлены, будет такая проблема.

Точно так же, как эти новые выражения эмодзи, выпущенные некоторыми производителями мобильных телефонов в жизни, они могут нормально отображаться на своих мобильных телефонах, но могут не отображаться на мобильных телефонах других марок. На самом деле это вызвано тем, что набор символов не поддерживается.

Когда возникает описанная выше ситуация,Если его нельзя отобразить, он также должен быть представлен символом.В Unicode этим символом является � , который также является специальным символом, определенным в Unicode. То есть "0xFFFD REPLACEMENT CHARACTER", все символы, которые не могут быть представлены, будут представлены этим символом.

У официального представителя Unicode есть введение в этот символ.Как вы можете видеть из приведенной выше таблицы, его десятичное представление — 65533. В UTF-8 его шестнадцатеричная форма — «0xEF 0xBF 0xBD» (три байта).

Если есть два последовательных символа, которые не могут быть отображены, например «� �», то в кодировке UTF-8 шестнадцатеричное представление будет следующим:

0xEF 0xBF 0xBD 
0xEF 0xBF 0xBD

Если приведенный выше код поместить в GBK для декодирования, поскольку в GBK есть два китайских символа, результат будет таким:

0xEF 0xBF, 0xBD 0xEF, 0xBF 0xBD

который

0xEFBF
0xBDEF
0xBFBD

Затем, если отображается, это: Кун (0xEFBF), Джин (0xBDEF), копия (0xBFBD),Поэтому, когда я снова увижу Kunjinkhao в будущем, правильно будет впервые подумать о преобразовании между UTF-8 и GBK.

В дополнение к Kunjinkuo есть еще два классических искаженных символа, а именно "Tangtangtang" и "Tuntuntun". Эти два искаженных символа генерируются из VC, который является операцией инициализации VC в памяти в режиме отладки. VC инициализирует вновь выделенную память в стеке значением 0xcc, а вновь выделенную память в куче — значением 0xcd. Печать 0xcc и 0xcd в соответствии с символами горяча и настраивается.