Кодирования с переменной шириной представляет собой тип кодировки символов схемы , в которой кода различной длины используется для кодирования набора символов (репертуар символов) для представления в компьютере . [1] Наиболее распространенными кодировками переменной ширины являются многобайтовые кодировки , в которых используется различное количество байтов ( октетов ) для кодирования различных символов. (Некоторые авторы, особенно в документации Microsoft, используют термин « многобайтовый набор символов», что является неправильным , поскольку размер представления является атрибутом кодировки, а не набора символов.)
Ранние кодировки переменной ширины с использованием менее одного байта на символ иногда использовались для упаковки английского текста в меньшее количество байтов в приключенческих играх для ранних микрокомпьютеров . Однако диски (которые, в отличие от лент, допускали произвольный доступ, позволяя загружать текст по запросу), увеличение памяти компьютера и алгоритмы сжатия общего назначения сделали такие уловки в значительной степени устаревшими.
Многобайтовые кодировки обычно являются результатом необходимости увеличить количество символов, которые могут быть закодированы без нарушения обратной совместимости с существующим ограничением. Например, с одним байтом (8 бит) на символ можно закодировать 256 возможных символов; для кодирования более 256 символов очевидным выбором будет использование двух или более байтов на единицу кодирования, два байта (16 бит) позволят 65 536 возможных символов, но такое изменение нарушит совместимость с существующими системами и, следовательно, может не быть осуществимым вообще.
Общая структура
Поскольку целью системы многобайтового кодирования является минимизация изменений в существующем прикладном программном обеспечении, некоторые символы должны сохранять свои ранее существовавшие коды единичных единиц, даже в то время как другие символы имеют несколько единиц в своих кодах. Результат является то , что есть три вида единиц в переменных ширинах кодирования: Singletons , которые состоят из одного блока, свинцовые блоки , которые поступают первым в последовательности многоместной, и след единицы , которые поступают затем в последовательности многоместной. Программное обеспечение ввода и отображения, очевидно, должно знать о структуре схемы многобайтового кодирования, но другому программному обеспечению обычно не нужно знать, представляет ли пара байтов два отдельных символа или только один символ.
Например, четырехсимвольная строка « 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 , первыми внедрившие Юникод повсюду, отказались от него и заменили его гораздо лучше разработанной кодировкой переменной ширины для Юникод: 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 кодовых точек, представленных высокими и низкими суррогатными парами) кодируемых кодовых точек (суррогатов). не кодируются).
Смотрите также
- wchar_t широкие символы
- Многобайтовый набор символов Lotus (LMBCS)
- Трехбайтовый набор символов (TBCS)
- Двухбайтовый набор символов (DBCS)
- Однобайтовый набор символов (SBCS)
Рекомендации
- ^ Криспин, М. (апрель 2005 г.). «Эффективные форматы преобразования Unicode UTF-9 и UTF-18» . DOI : 10.17487 / rfc4042 . Цитировать журнал требует
|journal=
( помощь )