Кодирование переменной ширины

редактировать

A Кодировка переменной ширины - это тип схемы кодировки символов, в которой коды различаются длины используются для кодирования набора символов (репертуар символов) для представления на компьютере. Наиболее распространенными кодировками переменной ширины являются многобайтовые кодировки, в которых используется различное количество байтов (октетов ) для кодирования различных символов. (Некоторые авторы, особенно в документации Microsoft, используют термин «многобайтовый набор символов», который является неправильным названием, поскольку размер представления является атрибутом кодировки, а не набора символов.)

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

Многобайтовые кодировки обычно являются результатом необходимости увеличить количество символов, которые могут быть закодированы без нарушения обратной совместимости с существующим ограничением. Например, с одним байтом (8 бит) на символ можно закодировать 256 возможных символов; для кодирования более 256 символов очевидным выбором будет использование двух или более байтов на единицу кодирования, два байта (16 бит) позволят 65 536 возможных символов, но такое изменение нарушит совместимость с существующими системами и, следовательно, может не быть осуществимым вообще.

Содержание

  • 1 Общая структура
  • 2 Многобайтовые кодировки CJK
  • 3 Кодировки переменной ширины Unicode
  • 4 См. Также
  • 5 Ссылки

Общая структура

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

Например, четырехсимвольная строка «I ♥ NY » кодируется в UTF-8 следующим образом (отображается как шестнадцатеричные байтовые значения): 49 E2 99 A5 4E 59. Из шести единиц в этой последовательности 49, 4E и 59 являются одиночными (для I, N и Y), E2 - ведущим, а 99 и A5 - ведомыми. Символ сердца представлен комбинацией ведущей единицы и двух ведомых единиц.

UTF-8 позволяет программе легко идентифицировать три вида единиц, поскольку они попадают в отдельные диапазоны значений. Старые кодировки с переменной шириной обычно не так хорошо разработаны, поскольку диапазоны могут перекрываться. Приложение обработки текста, которое имеет дело с кодированием переменной ширины, должно затем сканировать текст с начала всех окончательных последовательностей, чтобы идентифицировать различные единицы и правильно интерпретировать текст. В таких кодировках возможны ложные срабатывания при поиске строки в середине текста. Например, если все шестнадцатеричные значения DE, DF, E0 и E1 могут быть либо ведущими единицами, либо ведомыми единицами, то поиск последовательности из двух единиц DF E0 может дать ложное срабатывание в последовательности DE DF E0 E1, что состоит из двух последовательных двухэлементных последовательностей. Также существует опасность того, что один поврежденный или потерянный блок может сделать всю интерпретацию большого ряда последовательностей, состоящих из нескольких блоков, неверной. В кодировке с переменной шириной, где все три типа единиц разъединены, поиск по строке всегда работает без ложных срабатываний, и (при условии, что декодер хорошо написан) повреждение или потеря одной единицы искажает только один символ.

Многобайтовые кодировки CJK

Первое использование многобайтовых кодировок было для кодирования китайского, японского и корейского языков, которые имеют большие наборы символов, превышающие 256 символов. Сначала кодирование было ограничено до 7 бит. В кодировках ISO-2022-JP, ISO-2022-CN и ISO-2022-KR использовался диапазон 21–7E (шестнадцатеричный) как для ведущих единиц, так и для ведомых единиц, и они были отделены от синглтонов с помощью управляющих последовательностей ISO 2022 для переключение между однобайтовым и многобайтовым режимами. Сначала можно было закодировать в общей сложности 8 836 (94 × 94) символов, а затем - наборы из 94 × 94 символов с переключением. Схемы кодирования ISO 2022 для CJK все еще используются в Интернете. Состояние этих кодировок и большое перекрытие делают их очень неудобными для обработки.

На платформах Unix 7-битные кодировки ISO 2022 были заменены набором 8-битных схем кодирования, расширенным кодом Unix: EUC-JP, EUC-CN и EUC- KR. Вместо того, чтобы различать многоэлементные последовательности и синглтоны с escape-последовательностями, что делало кодирование с отслеживанием состояния, многоэлементные последовательности были отмечены набором наиболее значимых битов, то есть находились в диапазоне 80 – FF (шестнадцатеричный), в то время как синглетоны были только в диапазоне 00–7F. Ведущие блоки и ведомые блоки находились в диапазоне от A1 до FE (шестнадцатеричный), то есть в том же диапазоне, что и их диапазон в кодировках ISO 2022, но со старшим битом, установленным на 1. С этими кодировками было достаточно легко работать при условии, что все вашими разделителями были символы ASCII, и вы избегали усечения строк до фиксированной длины, но разрыв в середине многобайтового символа все равно мог вызвать серьезное повреждение.

На ПК (платформы DOS и Microsoft Windows ) были установлены две кодировки для японского и традиционного китайского языков, в которых все синглтоны, ведущие единицы и ведомые единицы перекрывались : Shift-JIS и Big5 соответственно. В Shift-JIS ведущие единицы имели диапазон 81–9F и E0 – FC, следовые части имели диапазон 40–7E и 80 – FC, а синглтоны имели диапазон 21–7E и A1 – DF. В Big5 ведущие единицы имели диапазон A1 – FE, следовые единицы имели диапазон 40–7E и A1 – FE, а синглтоны имели диапазон 21–7E (все значения в шестнадцатеричном формате). Это перекрытие снова сделало обработку сложной, хотя, по крайней мере, большинство символов имели уникальные байтовые значения (хотя, как ни странно, обратная косая черта не имеет).

Кодировки переменной ширины Unicode

Стандарт Unicode имеет две кодировки переменной ширины: UTF-8 и UTF-16 (он также имеет кодировку с фиксированной шириной, UTF-32 ). Первоначально стандарты Unicode и ISO 10646 должны были иметь фиксированную ширину, при этом Unicode был 16-битным, а ISO 10646 - 32-битным. ISO 10646 предоставил кодировку переменной ширины, называемую UTF-1, в которой синглтоны имели диапазон 00–9F, ведущие единицы - диапазон A0 – FF, а конечные единицы - диапазон A0 – FF и 21–7E. Из-за этой плохой конструкции, параллельно Shift-JIS и Big5 в его перекрытии значений, изобретатели операционной системы Plan 9 первыми реализовали Unicode повсюду, отказался от него и заменил его гораздо лучше разработанной кодировкой переменной ширины для Unicode: UTF-8, в которой одиночные символы имеют диапазон 00–7F, ведущие единицы имеют диапазон C0 – FD (теперь на самом деле C2 – F4, чтобы избегать чрезмерно длинных последовательностей и поддерживать синхронизацию с возможностями кодирования UTF-16 (см. статью UTF-8 ), а конечные блоки имеют диапазон 80 – BF. Ведущая единица также сообщает, сколько ведомых единиц следует за ней: одна после C2 – DF, две после E0 – EF и три после F0 – F4.

UTF-16 был разработан, чтобы освободиться от ограничения исходного Unicode (1.x) в 65 536 символов без нарушения совместимости с 16-битной кодировкой. В UTF-16 синглтоны имеют диапазон 0000 – D7FF (55 296 кодовых точек) и E000 – FFFF (8192 кодовых точки, всего 63 488), ведущие единицы - диапазон D800 – DBFF (1024 кодовых точки), а следовые - диапазон DC00– DFFF (1024 кодовых точки, всего 2048). Ведущие и ведомые блоки, называемые в терминологии Unicode высокими суррогатами и низкими суррогатами соответственно, отображают 1024 × 1024 или 1048 576 дополнительных символов, что составляет 1112 064 (63 488 кодовых точек BMP + 1048 576 кодовых точек, представленных высокими и низкими суррогатными парами) кодируемых кодовых точек (суррогатов не кодируются).

См. Также

Ссылки

Последняя правка сделана 2021-06-18 09:51:19
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте