Введение

Высокоуровневая 7- и 8-битная система кодирования символов

ISO/IEC 2022 «Информационные технологии — Структура кода символов и методы расширения» — это стандарт ISO/IEC в области кодирования символов. Он эквивалентен стандарту ECMA ECMA 35 и стандарту ANSI ANSI X3.41.

ISO 2022 определяет общую структуру, которой могут соответствовать кодировки символов, выделяя определенные диапазоны байтов (0x00–1F и 0x7F–9F) для использования непечатаемых управляющих кодов.
Формат кодирования этих наборов, предполагающий доступность 8 бит на байт,
Формат кодирования этих наборов в той же системе кодирования, когда доступно только 7 бит на байт, и метод преобразования любых соответствующих данных символов для прохождения через такую 7-битную среду,
Общая структура кодов ANSI escape, и
Конкретные форматы кодов escape для идентификации отдельных наборов символов, для объявления использования определенных функций кодирования или подмножеств и для взаимодействия или переключения на другие системы кодирования. В частности, 7-битные системы кодирования, использующие механизмы ISO/IEC 2022, включают ISO 2022 JP (или кодировку JIS), которая в основном используется в электронной почте на японском языке. 8-битные системы кодирования, соответствующие ISO/IEC 2022, включают ISO/IEC 4873 (ECMA 43), который, в свою очередь, соответствует ISO/IEC 8859. Более специализированные применения ISO 2022 включают систему кодирования MARC 8, используемую в библиотечных записях MARC 21. Escape-последовательности не только объявляют, какой набор символов используется, но и является ли набор однобайтовым или многобайтовым (хотя и не указывают, сколько байтов он использует, если он многобайтовый), а также, имеет ли каждый байт 94 или 96 допустимых значений.

Обозначение и номенклатура

Кодирование ISO/IEC 2022 определяет двухслойное соответствие между кодами символов и отображаемыми символами. Последовательности экранирования позволяют "назначить" любой из обширного реестра графических наборов символов одному из четырех рабочих наборов, именованных G0–G3, а более короткие управляющие последовательности указывают рабочий набор, который "активируется" для интерпретации байтов в потоке. Значения кодирования байтов ("битовые комбинации") часто представляются в виде колонно-строчной нотации, где два десятичных числа в диапазоне 00–15 (каждое из которых соответствует одной шестнадцатеричной цифре) разделяются косой чертой. Таким образом, например, коды 2/0 (0x20) – 2/15 (0x2F) включительно могут называться "столбцом 02". Эта нотация используется в самом стандарте ISO/IEC 2022 / ECMA 35. Они могут быть описаны в других местах в шестнадцатеричном формате, как это часто делается в данной статье, или с использованием соответствующих символов ASCII, хотя последовательности экранирования фактически определены в терминах значений байтов, и графический символ, присвоенный этому значению байта, может быть изменен без влияния на управляющую последовательность. Значения байтов из 7-битного графического диапазона ASCII (шестнадцатеричный 0x20–0x7F), расположенные слева в таблице кодов символов, называются кодами "GL" ("GL" расшифровывается как "graphics left" – графика слева), а байты из "верхнего" диапазона ASCII (0xA0–0xFF), если они доступны (т.е. в 8-битной среде), называются кодами "GR" ("graphics right" – графика справа). Термины "CL" (0x00–0x1F) и "CR" (0x80–0x9F) определены для диапазонов управления, но диапазон CL всегда активирует основные (C0) элементы управления, в то время как диапазон CR всегда активирует вторичные (C1) элементы управления или остается неиспользованным и всегда доступен при активации G0 поверх GL, независимо от того, какие наборы символов назначены. Они могут не включаться в графические наборы символов, хотя могут присутствовать другие размеры или типы пробельных символов.

Общий синтаксис последовательностей эскапп

Последовательности, использующие символ ESC (escape), имеют вид ESC [ ] , где символ ESC сопровождается нулем или более промежуточных байтов из диапазона 0x20–0x2F и одним заключительным байтом из диапазона 0x30–0x7E. Первый байт, или его отсутствие, определяет тип управляющей последовательности; он может, например, указывать на рабочий набор или обозначать единичную управляющую функцию. Во всех типах управляющих последовательностей байты в диапазоне 0x30–0x3F зарезервированы для незарегистрированного частного использования, определяемого предварительным соглашением между сторонами. Управляющие функции из некоторых наборов могут использовать дополнительные байты, следующие за самой управляющей последовательностью. Например, управляющая функция ISO 6429 "", которая может быть представлена с помощью управляющей последовательности, сопровождается нулем или более байтов в диапазоне 0x30–0x3F, затем нулем или более байтов в диапазоне 0x20–0x2F, затем одним байтом в диапазоне 0x40–0x7E, при этом вся последовательность называется "управляющей последовательностью".

Набор графических символов

Каждый из четырех рабочих наборов G0–G3 может быть набором из 94 символов или многобайтовым набором из 94n символов. Кроме того, наборы G1–G3 могут быть наборами из 96 или 96n символов. В наборе символов 96 или 96n байты 0x20–0x7F выделяются и могут использоваться набором при вызове GL, а байты 0xA0–0xFF – при вызове GR. В наборе символов 94 или 94n байты 0x20 и 0x7F не используются. Также сюда входят набор для построения рамок из ISO/IEC 10367 и ISO IR 164 (подмножество набора G1 из ISO 8859-8, содержащее только буквы, используемое CCITT).

Комбинация символов

Ожидается, что символы будут разделительными, а не комбинирующими, если иное не указано в соответствующем графическом наборе. ISO 2022 / ECMA 35 также допускает использование управляющих символов «возврат на начало строки» и «удаление символа» для объединения разделительных символов, а также последовательность CSI «Комбинация графических символов» (GCC).

Использование «возврата на начало строки» и «удаления символа» таким образом разрешено ISO/IEC 646, но запрещено ISO/IEC 4873 / ECMA 43 и ISO/IEC 8859, поскольку это оставляет набор графических символов неопределенным. Однако ISO/IEC 4873 / ECMA 43 допускает использование функции GCC при условии, что последовательность символов остается неизменной и отображается в одном месте, а не перезаписывается для формирования символа с другим значением.

Другие 7-битные версии

ISO 2022 KR определяется в RFC 1557, датированном 1993 годом. Он кодирует ASCII и корейский двухбайтовый стандарт KS X 1001 1992, ранее известный как KS C 5601 1987. В отличие от ISO 2022 JP 2, он использует символы Shift Out и Shift In для переключения между кодировками, после однократного включения ESC $ ) C в начале строки для обозначения KS X 1001 как G1. Он поддерживает наборы символов GB 2312 (для упрощенного китайского) и CNS 11643 (для традиционного китайского). Базовый профиль ISO 2022 CN использует ASCII в качестве набора G0 (при переключении), а также включает GB 2312 и первые две плоскости CNS 11643 (поскольку этих двух плоскостей достаточно для представления всех традиционных китайских символов из распространенного Big5, для которого RFC предоставляет соответствие в приложении): который преобразует все входные данные в символ замены (�), чтобы предотвратить определенные межсайтовые скрипты и связанные с ними атаки, использующие различия в поддержке кодировок между клиентом и сервером. Хотя та же проблема безопасности (допускающая различную интерпретацию последовательностей байтов ASCII) также применима к ISO 2022 JP и UTF-16, им не могли быть применены такие меры, поскольку они гораздо чаще используются в развернутом контенте. В апреле 2024 года была обнаружена уязвимость в реализации ISO 2022 CN EXT в glibc, что привело к рекомендациям полностью отключить эту кодировку в системах Linux.

Преимущества

Поскольку весь диапазон графических кодировок символов ISO/IEC 2022 может быть использован через GL, доступные глифы не ограничиваются невозможностью представления GR и C1, как это происходит в системах, ограниченных 7-битовыми кодировками. Таким образом, это позволяет представлять большое количество символов в такой системе. Как правило, эта 7-битная совместимость не представляет собой реального преимущества, за исключением обеспечения обратной совместимости со старыми системами. Подавляющее большинство современных компьютеров используют 8 бит на байт. В отличие от Unicode, ISO/IEC 2022 избегает унификации иероглифики, используя последовательности кодов для переключения между различными кодировками для разных восточноазиатских языков. Это позволяет избежать проблем, связанных с унификацией, таких как сложность поддержки нескольких языков CJK с их различными вариантами символов в одном документе и шрифте.

Недостатки

Поскольку ISO/IEC 2022 является кодировкой с состоянием, программа не может переходить в середину блока текста для поиска, вставки или удаления символов. Это делает манипулирование текстом очень сложным и медленным по сравнению с кодировками без состояния. Любой переход в середине текста может потребовать сохранения предыдущей управляющей последовательности, прежде чем байты, следующие за ней, смогут быть интерпретированы. В силу кодировки с состоянием ISO/IEC 2022, идентичные и эквивалентные символы могут быть закодированы в разных наборах символов, которые могут быть назначены любому из G0–G3 и вызываться с помощью одиночных переключений или блокирующих переключений в GL или GR. Следовательно, символы могут быть представлены несколькими способами, что означает, что две визуально идентичные и эквивалентные строки нельзя надёжно сравнивать на равенство. Некоторые системы, такие как DICOM и ряд почтовых клиентов, используют вариант ISO 2022 (например, "ISO 2022 IR 100") в дополнение к поддержке других кодировок. Такая вариативность затрудняет переносимый обмен текстом между компьютерными системами. UTF-1, многобайтовый формат преобразования Unicode, совместимый с представлением 8-битных управляющих символов в ISO/IEC 2022, имеет ряд недостатков по сравнению с UTF-8, и переключение на другие наборы символов, поддерживаемые ISO/IEC 2022, обычно не требуется в документах Unicode. Из-за использования управляющих последовательностей возможно создание вредоносных последовательностей байтов, в которых злонамеренная строка (например, для межсайтового скриптинга) маскируется до тех пор, пока не будет декодирована в Unicode, что может позволить ей обойти фильтрацию. 7-битные данные ISO 2022 (за исключением ISO 2022 JP) полностью отображаются на символ замены в HTML5 для предотвращения атак. Реализация этой меры, например, в Mozilla Thunderbird, привела к проблемам совместимости, когда неожиданные символы «�» появлялись при объединении двух потоков ISO 2022 JP.