stringtranslate.com

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

Кодировка переменной ширины — это тип схемы кодирования символов , в которой коды различной длины используются для кодирования набора символов (репертуара символов) для представления, обычно в компьютере . [1] [a] Наиболее распространенными кодировками переменной ширины являются многобайтовые кодировки (также известные как MBCSмногобайтовый набор символов ), которые используют различное количество байтов ( октетов ) для кодирования различных символов. (Некоторые авторы, особенно в документации Microsoft , используют термин многобайтовый набор символов, что является неправильным , поскольку размер представления является атрибутом кодировки, а не набора символов.)

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

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

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

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

Например, строка из четырех символов " 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 для переключения между однобайтовым и многобайтовым режимами. Всего можно было закодировать 8836 (94×94) символов сначала, а затем дополнительные наборы из 94×94 символов с переключением. Схемы кодировки ISO 2022 для CJK все еще используются в Интернете. Характер этих кодировок с сохранением состояния и большое перекрытие делают их очень неудобными для обработки.

На платформах Unix 7-битные кодировки ISO 2022 были заменены набором 8-битных схем кодировки, Extended Unix Code: 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. [c]

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

Смотрите также

Примечания

  1. ^ Однако эта концепция задолго предшествовала появлению электронного компьютера, как это видно на примере азбуки Морзе .
  2. ^ В качестве реального примера можно привести кодировку UTF-16 , которая представляет наиболее распространённые символы именно так, как описано выше (и использует пары 16-битных кодовых единиц для менее распространённых символов), которая так и не получила распространения в качестве кодировки текста, предназначенного для обмена, из-за её несовместимости с повсеместно распространённой 7-/8-битной кодировкой ASCII , а её предполагаемую роль вместо этого заняла кодировка UTF-8 , которая сохраняет совместимость с ASCII.
  3. ^ В оригинальной версии UTF-8, с момента публикации в 1992 году и до того, как ее кодовое пространство было ограничено UTF-16 в 2003 году, диапазон ведущих единиц, кодирующих трехединичные конечные последовательности, был больше (F0–F7); кроме того, за ведущими единицами F8–FB следовали четыре конечных единицы, а за FC–FD — пять. FE–FF никогда не были допустимыми ведущими или конечными единицами ни в одной из версий UTF-8.

Ссылки

  1. ^ Криспин, М. (1 апреля 2005 г.). Эффективные форматы преобразования UTF-9 и UTF-18 для Unicode . doi :10.17487/rfc4042.