Кодировка символов — это процесс присвоения чисел графическим символам , особенно письменным символам человеческого языка, что позволяет хранить, передавать и преобразовывать их с помощью компьютеров. [1] Числовые значения, составляющие кодировку символов, называются кодовыми точками и в совокупности составляют кодовое пространство, кодовую страницу или карту символов .
Ранние коды символов, связанные с оптическим или электрическим телеграфом, могли представлять только подмножество символов, используемых в письменных языках , иногда ограничиваясь только заглавными буквами , цифрами и некоторыми знаками препинания . Появление цифровых компьютерных систем позволяет использовать более сложные кодировки (такие как Unicode ) для поддержки сотен письменных языков.
Самой популярной кодировкой символов во Всемирной паутине является UTF-8 , которая используется на 98,2% обследованных веб-сайтов по состоянию на май 2024 года. [2] В прикладных программах и задачах операционной системы как UTF-8, так и UTF-16 являются популярными вариантами. [3]
История кодов символов иллюстрирует развивающуюся потребность в машинной символьной информации на основе символов на расстоянии, используя некогда новые электрические средства. Самые ранние коды были основаны на ручных и рукописных системах кодирования и шифрования, таких как шифр Бэкона , шрифт Брайля , международные морские сигнальные флаги и 4-значное кодирование китайских иероглифов для китайского телеграфного кода ( Ганс Шьеллеруп , 1869). С принятием электрических и электромеханических технологий эти самые ранние коды были адаптированы к новым возможностям и ограничениям ранних машин. Самый ранний известный электрически передаваемый код символов, азбука Морзе , представленная в 1840-х годах, использовала систему из четырех «символов» (короткий сигнал, длинный сигнал, короткий пробел, длинный пробел) для генерации кодов переменной длины. Хотя некоторое коммерческое использование азбуки Морзе осуществлялось с помощью машин, она часто использовалась как ручной код, генерируемый вручную на телеграфном ключе и расшифровываемый на слух, и сохраняется в любительском радио и авиационном использовании. Большинство кодов имеют фиксированную длину для каждого символа или представляют собой последовательности кодов фиксированной длины переменной длины (например, Unicode ). [4]
Распространенными примерами систем кодирования символов являются азбука Морзе, код Бодо , Американский стандартный код для обмена информацией (ASCII) и Unicode. Unicode, четко определенная и расширяемая система кодирования, заменила большинство более ранних кодировок символов, но путь развития кода до настоящего времени довольно хорошо известен.
Код Бодо, пятибитное кодирование , был создан Эмилем Бодо в 1870 году, запатентован в 1874 году, изменен Дональдом Мюрреем в 1901 году и стандартизирован CCITT как Международный телеграфный алфавит № 2 (ITA2) в 1930 году. Название Бодо ошибочно применялось к ITA2 и его многочисленным вариантам. ITA2 страдал от множества недостатков и часто улучшался многими производителями оборудования, иногда создавая проблемы совместимости. В 1959 году армия США определила свой код Fieldata , шести- или семибитный код, введенный Корпусом связи армии США. Хотя Fieldata решал многие из современных на тот момент проблем (например, коды букв и цифр, организованные для машинной сортировки), он не достиг своих целей и был недолговечным. В 1963 году комитетом ASCII (в который входил по крайней мере один член комитета Fieldata, В. Ф. Лейбберт) был выпущен первый код ASCII (X3.4-1963), который устранил большинство недостатков Fieldata, используя более простой код. Многие изменения были незначительными, например, наборы символов, которые можно сопоставлять в определенных числовых диапазонах. ASCII63 имел успех, был широко принят промышленностью, и с последующим выпуском кода ASCII 1967 года (который добавил строчные буквы и исправил некоторые проблемы с «контрольным кодом») ASCII67 был принят довольно широко. Американо-центричная природа ASCII67 была в некоторой степени учтена в европейском стандарте ECMA-6 . [5]
Герман Холлерит изобрел кодирование данных перфокарт в конце 19 века для анализа данных переписи населения. Первоначально каждая позиция отверстия представляла отдельный элемент данных, но позже числовая информация кодировалась путем нумерации нижних строк от 0 до 9, с перфорацией в столбце, представляющей его номер строки. Позже алфавитные данные кодировались путем разрешения более одного перфорации на столбец. Электромеханические табуляторные машины представляли дату внутренне с помощью синхронизации импульсов относительно движения карт через машину. Когда IBM перешла на электронную обработку, начиная с IBM 603 Electronic Multiplier, она использовала различные схемы двоичного кодирования, которые были привязаны к коду перфокарты.
IBM использовала несколько схем кодирования символов в двоично-десятичном коде ( BCD ), начиная с 1953 года в своих компьютерах 702 [6] и 704 , а также в более поздних сериях 7000 и 1400 , а также в связанных с ними периферийных устройствах. Поскольку код перфокарт, который тогда использовался, допускал только цифры, заглавные английские буквы и несколько специальных символов, шести бит было достаточно. Эти кодировки BCD расширили существующую простую четырехбитную числовую кодировку, включив в нее алфавитные и специальные символы, легко сопоставив их с кодировкой перфокарт, которая уже широко использовалась. Коды IBM использовались в основном с оборудованием IBM; другие поставщики компьютеров той эпохи имели свои собственные коды символов, часто шестибитные, но обычно имели возможность читать ленты, произведенные на оборудовании IBM. Эти кодировки BCD были предшественниками расширенного двоично-десятичного кода обмена данными IBM (обычно сокращенно EBCDIC), восьмибитной схемы кодирования, разработанной в 1963 году для IBM System/360 и имевшей более широкий набор символов, включая строчные буквы.
Пытаясь разработать универсально взаимозаменяемые кодировки символов, исследователи в 1980-х годах столкнулись с дилеммой, что, с одной стороны, казалось необходимым добавить больше бит для размещения дополнительных символов, но с другой стороны, для пользователей относительно небольшого набора символов латинского алфавита (которые все еще составляли большинство пользователей компьютеров) эти дополнительные биты были колоссальной тратой тогда дефицитных и дорогих вычислительных ресурсов (поскольку они всегда обнулялись для таких пользователей). В 1985 году жесткий диск среднего пользователя персонального компьютера мог хранить всего около 10 мегабайт, и он стоил примерно 250 долларов США на оптовом рынке (и намного дороже, если покупать его отдельно в розницу), [7] поэтому в то время было очень важно сделать каждый бит на счету.
Компромиссное решение, которое в конечном итоге было найдено и преобразовано в Unicode [ неопределенно ] , состояло в том, чтобы сломать предположение (восходящее к телеграфным кодам), что каждый символ всегда должен напрямую соответствовать определенной последовательности бит. Вместо этого символы сначала сопоставлялись с универсальным промежуточным представлением в форме абстрактных чисел, называемых кодовыми точками . Затем кодовые точки представлялись различными способами и с различными значениями по умолчанию для каждого символа (кодовыми единицами) в зависимости от контекста. Чтобы закодировать кодовые точки, превышающие длину кодовой единицы, например, выше 256 для восьмибитных единиц, решение состояло в реализации кодировок переменной длины , где escape-последовательность сигнализировала бы о том, что последующие биты следует анализировать как более высокую кодовую точку.
Неформально термины «кодировка символов», «карта символов», «набор символов» и «кодовая страница» часто используются взаимозаменяемо. [8] Исторически один и тот же стандарт определял набор символов и то, как они должны были быть закодированы в поток кодовых единиц — обычно с одним символом на кодовую единицу. Однако из-за появления более сложных кодировок символов различие между этими терминами стало важным.
«Кодовая страница» — историческое название набора кодированных символов.
Первоначально кодовая страница ссылалась на определенный номер страницы в руководстве по стандартным наборам символов IBM, которое определяло конкретную кодировку символов. [12] Другие поставщики, включая Microsoft , SAP и Oracle Corporation , также опубликовали свои собственные наборы кодовых страниц; наиболее известными наборами кодовых страниц являются « Windows » (на основе Windows-1252) и «IBM»/«DOS» (на основе кодовой страницы 437 ).
Несмотря на то, что в стандарте больше не упоминаются конкретные номера страниц, многие кодировки символов по-прежнему обозначаются номером кодовой страницы; аналогично, термин «кодовая страница» часто по-прежнему используется для обозначения кодировок символов в целом.
Термин «кодовая страница» не используется в Unix или Linux, где предпочтительнее «charmap», обычно в более широком контексте локалей. Архитектура представления символьных данных IBM (CDRA) обозначает сущности с помощью кодированных идентификаторов набора символов ( CCSID ), каждый из которых по-разному называется «charset», «character set», «code page» или «CHARMAP». [11]
Размер кодовой единицы эквивалентен измерению бит для конкретной кодировки:
Кодовая точка представлена последовательностью кодовых единиц. Отображение определяется кодировкой. Таким образом, количество кодовых единиц, необходимых для представления кодовой точки, зависит от кодировки:
То, что именно представляет собой символ, различается в зависимости от кодировки символов.
Например, для букв с диакритическими знаками существует два различных подхода, которые можно использовать для их кодирования: они могут быть закодированы либо как один объединенный символ (известный как предкомпозитный символ), либо как отдельные символы, которые объединяются в один глиф . Первый вариант упрощает систему обработки текста, но последний позволяет использовать в тексте любую комбинацию букв/диакритических знаков. Лигатуры создают похожие проблемы.
Как именно обрабатывать варианты глифов — это выбор, который необходимо сделать при построении конкретной кодировки символов. Некоторые системы письма, такие как арабский и иврит, должны учитывать такие вещи, как графемы , которые соединяются по-разному в разных контекстах, но представляют один и тот же семантический символ.
Unicode и его параллельный стандарт, универсальный набор символов ISO/IEC 10646 , вместе составляют единый стандарт кодирования символов. Вместо того, чтобы напрямую отображать символы в байты , Unicode отдельно определяет кодированный набор символов, который отображает символы в уникальные натуральные числа ( кодовые точки ), как эти кодовые точки отображаются в ряд натуральных чисел фиксированного размера (кодовые единицы) и, наконец, как эти единицы кодируются в виде потока октетов (байтов). Целью этого разложения является установление универсального набора символов, которые могут быть закодированы различными способами. Чтобы точно описать эту модель, Unicode использует свой собственный набор терминов для описания своего процесса: [11]
Репертуар абстрактных символов (ACR) — это полный набор абстрактных символов, поддерживаемых системой. Unicode имеет открытый репертуар, что означает, что со временем в репертуар будут добавляться новые символы.
Кодированный набор символов (CCS) — это функция , которая сопоставляет символы с кодовыми точками (каждая кодовая точка представляет один символ). Например, в данном репертуаре заглавная буква «A» в латинском алфавите может быть представлена кодовой точкой 65, символ «B» — 66 и т. д. Несколько кодированных наборов символов могут совместно использовать один и тот же репертуар символов; например, кодовые страницы ISO/IEC 8859-1 и IBM 037 и 500 охватывают один и тот же репертуар, но сопоставляют их с разными кодовыми точками.
Форма кодирования символов (CEF) — это отображение кодовых точек в кодовые единицы для облегчения хранения в системе, которая представляет числа как битовые последовательности фиксированной длины (т. е. практически любая компьютерная система). Например, система, которая хранит числовую информацию в 16-битных единицах, может напрямую представлять только кодовые точки от 0 до 65 535 в каждой единице, но более крупные кодовые точки (скажем, от 65 536 до 1,4 миллиона) могут быть представлены с использованием нескольких 16-битных единиц. Это соответствие определяется CEF.
Схема кодирования символов (CES) — это отображение кодовых единиц в последовательность октетов для облегчения хранения в файловой системе на основе октетов или передачи по сети на основе октетов. Простые схемы кодирования символов включают UTF-8 , UTF-16BE , UTF-32BE , UTF-16LE и UTF-32LE ; составные схемы кодирования символов, такие как UTF-16 , UTF-32 и ISO/IEC 2022 , переключаются между несколькими простыми схемами с помощью метки порядка байтов или escape-последовательностей ; схемы сжатия пытаются минимизировать количество байтов, используемых на единицу кода (например, SCSU и BOCU ).
Хотя UTF-32BE и UTF-32LE являются более простыми CES, большинство систем, работающих с Unicode, используют либо UTF-8 , который обратно совместим с ASCII фиксированной длины и отображает кодовые точки Unicode в последовательности октетов переменной длины, либо UTF-16BE , [ требуется ссылка ] который обратно совместим с UCS-2BE фиксированной длины и отображает кодовые точки Unicode в последовательности 16-битных слов переменной длины. Подробное обсуждение см. в сравнении кодировок Unicode .
Наконец, может быть протокол более высокого уровня , который предоставляет дополнительную информацию для выбора конкретного варианта символа Unicode , особенно там, где есть региональные варианты, которые были «унифицированы» в Unicode как один и тот же символ. Примером является атрибут XML xml:lang.
Модель Unicode использует термин «карта символов» для других систем, которые напрямую назначают последовательность символов последовательности байтов, охватывая все слои CCS, CEF и CES. [11]
В Unicode символ может обозначаться как «U+», за которым следует его кодовое значение в шестнадцатеричном формате. Диапазон допустимых кодовых точек (кодовое пространство) для стандарта Unicode составляет от U+0000 до U+10FFFF включительно, разделенное на 17 плоскостей , идентифицируемых числами от 0 до 16. Символы в диапазоне от U+0000 до U+FFFF находятся в плоскости 0, называемой базовой многоязыковой плоскостью (BMP). Эта плоскость содержит наиболее часто используемые символы. Символы в диапазоне от U+10000 до U+10FFFF в других плоскостях называются дополнительными символами .
В следующей таблице приведены примеры значений кодовых точек:
Рассмотрим строку букв "ab̲c𐐀" — то есть строку, содержащую объединяющий символ Unicode ( U+0332 ̲ COMBINING LOW LINE ), а также дополнительный символ ( U+10400 𐐀 DESERET CAPITAL LETTER LONG I ). Эта строка имеет несколько представлений Unicode, которые логически эквивалентны, но при этом каждое из них подходит для различных наборов обстоятельств или диапазона требований:
a
, b̲
, c
,𐐀
a
, b
, _
, c
,𐐀
U+0061
, U+0062
, U+0332
, U+0063
,U+10400
0x00000061
, 0x00000062
, 0x00000332
, 0x00000063
,0x00010400
0x0061
, 0x0062
, 0x0332
, 0x0063
, 0xD801
,0xDC00
0x61
, 0x62
, 0xCC
, 0xB2
, 0x63
, 0xF0
, 0x90
, 0x90
,0x80
Обратите внимание, что 𐐀 представлен одним 32-битным значением (UTF-32), двумя 16-битными значениями (UTF-16) или четырьмя 8-битными значениями (UTF-8). Хотя каждая из этих форм использует одинаковое общее количество бит (32) для представления глифа, неочевидно, как связаны фактические числовые значения байтов.
В результате использования множества методов кодирования символов (и необходимости обратной совместимости с архивированными данными) было разработано множество компьютерных программ для перевода данных между схемами кодирования символов, процесс, известный как транскодирование . Некоторые из них приведены ниже.
Окна :
Наиболее используемая кодировка символов в Интернете — UTF-8 , которая используется на 98,2% обследованных веб-сайтов по состоянию на май 2024 года. [2] В прикладных программах и задачах операционной системы как UTF-8, так и UTF-16 являются популярными вариантами. [3] [17]
для Android: платформа Android по умолчанию всегда использует UTF-8.
дополнение к традиционным наборам символов
DEC
и
ISO
, которые соответствуют структуре и правилам
ISO 2022
,
VT510
поддерживает ряд кодовых страниц IBM PC (
номера страниц
в руководстве по стандартным наборам символов IBM) в режиме PCTerm для эмуляции
консольного терминала
стандартных ПК.
на самом деле вы обычно просто предполагаете UTF-8, поскольку это, безусловно, самая распространенная кодировка.