Кодировка символов - Character encoding

Перфолента со словом "Википедия", закодированным в ASCII. Наличие и отсутствие отверстия обозначают 1 и 0 соответственно; например, «W» кодируется как «1010111».

В вычисление, хранилище данных, и передача данных, кодировка символов используется для представления репертуара символы каким-то кодирование система, которая присваивает каждому символу номер для цифрового представления.[1] В зависимости от уровень абстракции и контекст, соответствующий кодовые точки и результирующее пространство кода можно рассматривать как битовые шаблоны, октеты, естественный числа, электрические импульсы и т. д. Кодировка символов используется в вычисление, хранение данных и передача текстовых данных. «Набор символов», «карта символов», «набор кодов» и «кодовая страница "являются родственными, но не идентичными терминами.

Коды ранних символов, связанные с оптическими или электрическими телеграф может представлять только подмножество символов, используемых в письменные языки, иногда ограничивается заглавные буквы, цифры и немного пунктуация Только. Низкая стоимость цифрового представления данных в современных компьютерных системах позволяет использовать более сложные коды символов (например, Unicode ), которые представляют большинство символов, используемых во многих письменных языках. Кодирование символов с использованием международно признанных стандартов позволяет обмениваться текстом в электронной форме во всем мире.

История

История кодов символов иллюстрирует растущую потребность в машинно-опосредованной символьной символической информации на расстоянии с использованием когда-то новых электрических средств. Самые ранние коды были основаны на ручных и рукописных системах кодирования и шифрования, таких как Шифр Бэкона, Шрифт Брайля, Международные морские сигнальные флаги и 4-значная кодировка китайских иероглифов для Китайский телеграфный код (Ханс Шеллеруп, 1869). С принятием электрических и электромеханических методов эти самые ранние коды были адаптированы к новым возможностям и ограничениям ранних машин. Самый ранний известный символьный код, передаваемый электрически, азбука Морзе, представленный в 1840-х годах, использовал систему из четырех «символов» (короткий сигнал, длинный сигнал, короткий интервал, длинный интервал) для генерации кодов переменной длины. Хотя в основном азбука Морзе использовалась в коммерческих целях с помощью машин,[нужна цитата ] он также использовался как ручной код, сгенерированный вручную на телеграфный ключ и расшифровывается на слух, и сохраняется в любительском радио. Большинство кодов имеют фиксированную символьную длину или последовательности кодов фиксированной длины переменной длины (например, Unicode ).[2]

Общие примеры систем кодирования символов включают: азбука Морзе, то Код Бодо, Американский стандартный код для обмена информацией (ASCII ) и Unicode. Unicode, хорошо определенная и расширяемая система кодирования, вытеснила большинство более ранних кодировок символов, но путь разработки кода до настоящего времени довольно хорошо известен.

В Код Бодо, пятибитная кодировка, была создана Эмиль Бодо в 1870 году, запатентован в 1874 году, модифицирован Дональдом Мюрреем в 1901 году и стандартизирован CCITT как Международный телеграфный алфавит № 2 (ITA2) в 1930 году. Название «бодо» было ошибочно применено к ITA2 и ее многочисленным вариантам. ITA2 страдает множеством недостатков и часто «улучшается» многими производителями оборудования, иногда создавая проблемы совместимости. В 1959 году американские военные определили Fieldata code, шести- или семибитный код, представленный Службой связи армии США. В то время как Fieldata решала многие из тогдашних проблем (например, буквенные и цифровые коды для машинной сортировки), Fieldata не достигла своих целей и просуществовала недолго. В 1963 году первый код ASCII (Американский стандартный код для обмена информацией) был выпущен (X3.4-1963) комитетом ASCII (в который входил по крайней мере один член комитета Fieldata, У. Ф. Леубберт), который устранил большинство недостатков Fieldata. , используя более простой код. Многие изменения были незначительными, например, упорядочиваемый набор символов в определенных числовых диапазонах. ASCII63 имел успех, получил широкое распространение в промышленности, и с последующим выпуском кода ASCII 1967 года (который добавил строчные буквы и исправил некоторые проблемы с "контрольным кодом") ASCII67 получил довольно широкое распространение. Ориентированность на Америку ASCII67 в некоторой степени рассматривалась в европейских ECMA-6 стандарт.[3]

Несколько исторически изолированные, IBM с Десятичное число с двоичным кодом (BCD ) представляла собой шестибитную схему кодирования, использовавшуюся IBM еще в 1959 г. 1401 и 1620 компьютеры, и в его 7000 серии (например, компьютеры 704, 7040, 709 и 7090), а также в сопутствующих периферийных устройствах. BCD расширил существующее простое четырехбитное числовое кодирование, включив в него буквенные и специальные символы, легко сопоставив его с кодировкой перфокарт, которая уже широко использовалась. Это был предшественник EBCDIC. По большей части коды IBM использовались в основном с оборудованием IBM, которое представляло собой более или менее закрытую экосистему и не находило широкого распространения за пределами «кругов» IBM. IBM с Расширенный двоично-десятичный код обмена (обычно сокращенно EBCDIC) - восьмибитная схема кодирования, разработанная в 1963 году.

Ограничения таких наборов вскоре стали очевидны.[кому? ] и ряд для этого случая были разработаны методы их расширения. Необходимость поддерживать больше системы письма для разных языков, включая CJK семья Восточноазиатские шрифты, требовала поддержки гораздо большего количества символов и требовала систематического подхода к кодировке символов, а не предыдущего для этого случая подходы.[нужна цитата ]

Пытаясь разработать универсально взаимозаменяемые кодировки символов, исследователи в 1980-х годах столкнулись с дилеммой: с одной стороны, казалось необходимым добавить больше битов для размещения дополнительных символов, но с другой стороны, для пользователей относительно небольшого набора символов латинского алфавита (который все еще составлял большинство пользователей компьютеров), эти дополнительные биты были колоссальной тратой тогда скудных и дорогих вычислительных ресурсов (поскольку они всегда были бы обнулены для таких пользователей). В 1985 году средний пользователь привод жесткого диска мог хранить только около 10 мегабайт,[4] поэтому в то время было очень важно учитывать каждый бит.

Компромиссное решение, которое в конечном итоге было найдено и разработано в Unicode, заключалось в том, чтобы разрушить предположение (восходящее к телеграфным кодам), что каждый символ всегда должен напрямую соответствовать определенной последовательности битов. Вместо этого символы сначала будут отображаться в универсальное промежуточное представление в виде абстрактных чисел, называемых кодовые точки. Затем кодовые точки будут представлены различными способами и с различным количеством битов на символ (кодовые единицы) по умолчанию в зависимости от контекста. Для кодирования кодовых точек, превышающих длину кодовой единицы, например, более 256 для 8-битных единиц, решение заключалось в реализации кодировки переменной ширины где escape-последовательность будет сигнализировать, что последующие биты должны быть проанализированы как более высокая кодовая точка.

Терминология

Терминология, связанная с кодировкой символов
KB Dubeolsik для Old Hangul (NG3) .svg
  • А персонаж это минимальная единица текста, имеющая семантическое значение.
  • А набор символов представляет собой набор символов, которые могут использоваться на нескольких языках. Пример: Набор латинских символов используется в английском и большинстве европейских языков, хотя набор символов греческого языка используется только в греческом языке.
  • А кодированный набор символов представляет собой набор символов, в котором каждому символу соответствует уникальный номер.
  • А кодовая точка кодированного набора символов - это любое допустимое значение в наборе символов или кодовом пространстве.
  • А кодовое пространство это диапазон целых чисел, значения которых являются кодовыми точками
  • А кодовый блок битовая последовательность, используемая для кодирования каждого символа репертуара в заданной форме кодирования. Это называется значение кода в некоторых документах.[5]
Репертуар персонажей (абстрактный набор персонажей)

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

Другие символы, такие как ноты, также включены в репертуар персонажей. И Юникод, и GB18030 стандарты имеют репертуар персонажей. Поскольку новые символы добавляются к одному стандарту, другой стандарт также добавляет эти символы для поддержания четности.

Размер кодовой единицы эквивалентен битовому измерению для конкретной кодировки:

  • Единица кода в US-ASCII состоит из 7 бит;
  • Кодовый блок в UTF-8, EBCDIC а GB18030 состоит из 8 бит;
  • Кодовый блок в UTF-16 состоит из 16 бит;
  • Кодовый блок в UTF-32 состоит из 32 бит.

Пример кодовой единицы: Рассмотрим нить букв "abc", за которыми следует U + 10400 𐐀 ЗАГЛАВНАЯ БУКВА ДОЛГОЙ I (представлен 1 char32_t, 2 char16_t или 4 char8_t). Эта строка содержит:

  • четыре персонажа;
  • четыре кодовых точки
  • либо:
    четыре кодовых единицы в UTF-32 (00000061, 00000062, 00000063, 00010400)
    пять кодовых единиц в UTF-16 (0061, 0062, 0063, d801, dc00) или
    семь кодовых единиц в UTF-8 (61, 62, 63, f0, 90, 90, 80).

Условие для обозначения символа в Юникоде должно начинаться с символа «U +», за которым следует значение кодовой точки в шестнадцатеричном формате. Диапазон допустимых кодовых точек для стандарта Unicode составляет от U + 0000 до U + 10FFFF включительно, разделенных на 17 самолеты, идентифицируемые номерами от 0 до 16. Символы в диапазоне от U + 0000 до U + FFFF находятся в плоскости 0, называемой Базовая многоязычная плоскость (BMP). Этот самолет содержит наиболее часто используемые персонажи. Символы в диапазоне от U + 10000 до U + 10FFFF в других плоскостях называются дополнительные символы.

В следующей таблице показаны примеры значений кодовой точки:

ХарактерКодовая точка UnicodeГлиф
Латиница AU + 0041Α
Латинское диез SU + 00DFSS
Хан для ВостокаU + 6771
АмперсандU + 0026&
Перевернутый восклицательный знакU + 00A1¡
Знак разделаU + 00A7§

Кодовая точка представлена ​​последовательностью кодовых единиц. Отображение определяется кодировкой. Таким образом, количество кодовых единиц, необходимых для представления кодовой точки, зависит от кодировки:

  • UTF-8: кодовые точки отображаются в последовательность из одной, двух, трех или четырех кодовых единиц.
  • UTF-16: единицы кода вдвое длиннее 8-битных единиц кода. Следовательно, любая кодовая точка со скалярным значением меньше U + 10000 кодируется с помощью одной кодовой единицы. Для кодовых точек со значением U + 10000 или выше требуется по две кодовых единицы каждая. Эти пары кодовых единиц имеют уникальный термин в UTF-16: «Суррогатные пары Unicode».
  • UTF-32: 32-битная кодовая единица достаточно велика, чтобы каждая кодовая точка была представлена ​​как одна кодовая единица.
  • GB18030: несколько кодовых единиц на кодовую точку являются общими из-за небольших кодовых единиц. Кодовые точки отображаются в одну, две или четыре кодовых единицы.[6]

Модель кодирования Unicode

Unicode и его параллельный стандарт ISO / IEC 10646 Универсальный набор символов вместе составляют современную унифицированную кодировку символов. Вместо того, чтобы отображать символы напрямую в октеты (байты ), они отдельно определяют, какие символы доступны, соответствующие натуральные числа (кодовые точки ), как эти числа кодируются как последовательность натуральных чисел фиксированного размера (кодовых единиц), и, наконец, как эти единицы кодируются как поток октетов. Цель этого разбиения - установить универсальный набор символов, который можно закодировать различными способами.[7] Для правильного описания этой модели требуются более точные термины, чем «набор символов» и «кодировка символов». В современной модели используются следующие термины:[7]

А репертуар персонажей - это полный набор абстрактных символов, поддерживаемых системой. Репертуар может быть закрыт, т. Е. Никакие добавления не допускаются без создания нового стандарта (как в случае с ASCII и большей частью серии ISO-8859), или он может быть открытым, позволяя дополнения (как в случае с Unicode и в ограниченной степени Кодовые страницы Windows ). Персонажи данного репертуара отражают принятые решения о том, как разделить системы письма на основные информационные единицы. Основные варианты латинский, Греческий и Кириллица алфавиты можно разбить на буквы, цифры, знаки препинания и несколько специальные символы например, пространство, которое можно упорядочить в простые линейные последовательности, отображаемые в том же порядке, в котором они читаются. Но даже с этими алфавитами диакритические знаки представляют собой сложность: их можно рассматривать либо как часть одного символа, содержащего букву и диакритический знак (известный как предварительно составленный символ), либо как отдельные символы. Первый позволяет использовать гораздо более простую систему обработки текста, но второй позволяет использовать в тексте любую комбинацию букв и диакритических знаков. Лигатуры создают аналогичные проблемы. Другие системы письма, такие как арабский и иврит, представлены более сложным набором символов из-за необходимости учитывать такие вещи, как двунаправленный текст и глифы которые соединяются по-разному для разных ситуаций.

А кодированный набор символов (CCS) - это функция который отображает персонажей в кодовые точки (каждая кодовая точка представляет один символ). Например, в данном репертуаре заглавная буква «A» в латинском алфавите может быть представлена ​​кодовой точкой 65, символом «B» - 66 и так далее. Несколько наборов кодированных символов могут иметь один и тот же репертуар; Например ИСО / МЭК 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-последовательности; схемы сжатия пытаются минимизировать количество байтов, используемых на единицу кода (например, ГКГУ, BOCU, и Punycode ).

Несмотря на то что UTF-32BE это более простой CES, большинство систем, работающих с Unicode, используют либо UTF-8, который обратная совместимость с ASCII фиксированной ширины и отображает кодовые точки Unicode в последовательности октетов переменной ширины, или UTF-16BE, который обратная совместимость с фиксированной шириной UCS-2BE и отображает кодовые точки Unicode в последовательности 16-битных слов переменной ширины. Видеть сравнение кодировок Unicode для подробного обсуждения.

Наконец, может быть протокол более высокого уровня который предоставляет дополнительную информацию для выбора конкретного варианта Unicode символ, особенно там, где есть региональные варианты, которые были «унифицированы» в Unicode как один и тот же символ. Примером может служить XML атрибут xml: lang.

В модели Unicode используется термин карта персонажей для исторических систем, которые напрямую назначают последовательность символов последовательности байтов, охватывая все уровни CCS, CEF и CES.[7]

Наборы символов, карты символов и кодовые страницы

Исторически сложилось так, что термины «кодировка символов», «карта символов», «набор символов» и «кодовая страница "были синонимами в Информатика, поскольку тот же стандарт будет определять репертуар символов и то, как они должны быть закодированы в поток кодовых единиц - обычно с одним символом на кодовую единицу. Но теперь термины имеют связанные, но разные значения,[8] благодаря усилиям органов по стандартизации использовать точную терминологию при описании и унификации множества различных систем кодирования.[7] Тем не менее, эти термины по-прежнему используются как синонимы с набор символов быть почти повсеместным.

А "кодовая страница"обычно означает байтовый кодировка, но что касается некоторого набора кодировок (охватывающих разные сценарии), где многие символы имеют одинаковые коды в большинстве или во всех этих кодовых страницах. Хорошо известными наборами кодовых страниц являются "Windows" (на основе Windows-1252) и "IBM" / "DOS" (на основе кодовая страница 437 ), видеть Кодовая страница Windows для подробностей. Большинство, но не все, кодировки, называемые кодовыми страницами, являются однобайтовыми (но см. октет по размеру байта.)

Архитектура представления символьных данных IBM (CDRA) обозначает с помощью кодированных идентификаторов набора символов (CCSID ), каждый из которых по-разному называется «набором символов», «набором символов», «кодовой страницей» или «CHARMAP».[7]

Термин «кодовая страница» не встречается в Unix или Linux, где предпочтительнее «charmap», обычно в более широком контексте локалей.

В отличие от "кодированный набор символов "," кодировка символов "- это карта от абстрактных символов к кодовые слова. «Набор символов» в HTTPMIME ) язык совпадает с кодировкой символов (но не совпадает с CCS).

"Наследие кодировка "- это термин, который иногда используется для характеристики старых кодировок символов, но с неоднозначным смыслом. В основном он используется в контексте Юникодификация, где это относится к кодировкам, которые не охватывают все кодовые точки Unicode, или, в более общем плане, используют несколько иной репертуар символов: несколько кодовых точек, представляющих один символ Unicode,[9] или наоборот (см., например, кодовая страница 437 ). Некоторые источники называют кодировку наследие только потому, что он предшествовал Unicode.[10] Все кодовые страницы Windows обычно называют устаревшими как потому, что они предшествуют Unicode, так и потому, что они не могут представить все 221 возможные точки кода Unicode.

Перевод кодировки символов

В результате использования множества методов кодирования символов (и необходимости обратной совместимости с архивными данными) было разработано множество компьютерных программ для преобразования данных между схемами кодирования в виде данных. перекодирование. Некоторые из них цитируются ниже.

Кроссплатформенность:

  • Веб-браузеры - большинство современных веб-браузеров поддерживают автоматическое определение кодировки символов. Например, в Firefox 3 см. Подменю «Вид / Кодировка символов».
  • iconv - программа и стандартизованный API для преобразования кодировок
  • люит - программа, преобразующая кодировку ввода и вывода в программы, работающие в интерактивном режиме
  • convert_encoding.py - Утилита на основе Python для преобразования текстовых файлов между произвольными кодировками и окончаниями строк.[11]
  • decodeh.py - алгоритм и модуль для эвристического угадывания кодировки строки.[12]
  • Международные компоненты для Unicode - Набор библиотек C и Java для преобразования кодировки. uconv можно использовать из ICU4C.
  • Chardet - Это перевод Mozilla код автоматического кодирования-обнаружения на компьютерный язык Python.
  • Более новые версии Unix файл попытка команды выполнить базовое определение кодировки символов (также доступно на Cygwin ).
  • кодировкаC ++ библиотека шаблонов с простым интерфейсом для преобразования между C ++ / пользовательскими потоками. charset определяет множество наборов символов и позволяет использовать форматы Unicode с поддержкой порядок байтов.

Unix-подобный:

  • cmv - простой инструмент для перекодировки имен файлов.[13]
  • convmv - преобразовать имя файла из одной кодировки в другую.[14]
  • cstocs - конвертировать содержимое файла из одной кодировки в другую для чешского и словацкого языков.
  • enca - анализирует кодировки для заданных текстовых файлов.[15]
  • recode - конвертировать содержимое файла из одной кодировки в другую[16]
  • utrac - конвертировать содержимое файла из одной кодировки в другую.[17]

Windows:

  • Encoding.Convert - .NET API[18]
  • MultiByteToWideChar / WideCharToMultiByte - преобразование из ANSI в Unicode и Unicode в ANSI[19]
  • cscvt - инструмент преобразования набора символов[20]
  • enca - анализирует кодировки для заданных текстовых файлов.[21]

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

Общие кодировки символов

Рекомендации

  1. ^ Определение из Словарь технических терминов
  2. ^ Том Хендерсон (17 апреля 2014 г.). «Древние компьютерные таблицы кодов символов - и почему они все еще актуальны». Умный медведь. Получено 29 апреля 2014.
  3. ^ Том Дженнингс (1 марта 2010 г.). «Аннотированная история некоторых кодов символов». Получено 1 ноября 2018.
  4. ^ Стрелхо, Кевин (15 апреля 1985 г.). «IBM приводит жесткие диски в соответствие с новыми стандартами». InfoWorld. Popular Computing Inc., стр. 29–33.. Получено 10 ноября 2020.
  5. ^ «Глоссарий Unicode». Консорциум Unicode.
  6. ^ «Учебники по Java - Терминология». Oracle. Получено 25 марта 2018.
  7. ^ а б c d е «Технический отчет Unicode № 17: Модель кодирования символов Unicode». 11 ноября 2008 г.. Получено 8 августа 2009.
  8. ^ Шон Стил (15 марта 2005 г.). «В чем разница между кодировкой, кодовой страницей, набором символов и Unicode?». MSDN.
  9. ^ «Обработка информации из базы данных с использованием Unicode, пример из практики» В архиве 17 июня 2006 г. Wayback Machine
  10. ^ Констебль, Питер (13 июня 2001 г.). «Основы кодирования набора символов». Внедрение систем письма: введение. SIL International. Архивировано из оригинал 5 мая 2013 г.. Получено 19 марта 2010.
  11. ^ convert_encoding.py
  12. ^ Decodeh - эвристически декодировать строку или текстовый файл В архиве 8 января 2008 г. Wayback Machine
  13. ^ CharsetMove - простой инструмент для перекодировки имен файлов
  14. ^ Convmv - конвертирует имена файлов из одной кодировки в другую.
  15. ^ «Чрезвычайно наивный анализатор набора символов». Архивировано из оригинал 4 декабря 2010 г.. Получено 11 марта 2008.
  16. ^ Перекодирование - проект GNU - Фонд свободного программного обеспечения (ФСПО)
  17. ^ Домашняя страница Utrac
  18. ^ Библиотека классов Microsoft .NET Framework - метод Encoding.Convert
  19. ^ MultiByteToWideChar / WideCharToMultiByte - преобразование из ANSI в Unicode и Unicode в ANSI
  20. ^ Конвертер набора символов Калитты
  21. ^ «Чрезвычайно наивный анализатор набора символов». Архивировано из оригинал 15 марта 2012 г.. Получено 31 марта 2011.

дальнейшее чтение

внешняя ссылка