stringtranslate.com

Кодировка символов

Перфолента со словом «Википедия», закодированным в 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 году военные США определили свой код Fielddata — шести- или семибитный код, введенный Корпусом связи армии США. Хотя Fielddata решала многие современные на тот момент проблемы (например, коды букв и цифр, организованные для машинной сортировки), она не достигла своих целей и просуществовала недолго. В 1963 году комитет ASCII (в который входил по крайней мере один член комитета Fielddata, В. Ф. Леубберт) выпустил первый код ASCII (X3.4-1963), который устранил большинство недостатков Fielddata, используя более простой код. Многие изменения были незначительными, например, сопоставление наборов символов в определенных числовых диапазонах. ASCII63 имел успех, широко был принят в промышленности, а с последующим выпуском кода ASCII 1967 года (в котором были добавлены строчные буквы и исправлены некоторые проблемы с «управляющим кодом») ASCII67 получил довольно широкое распространение. Американоцентричный характер ASCII67 был в некоторой степени учтен в европейском стандарте ECMA-6 . [3]

Перфокарта Холлерита на 80 столбцов с набором символов EBCDIC

Герман Холлерит изобрел кодирование данных перфокарт в конце 19 века для анализа данных переписи населения. Первоначально каждое положение отверстия представляло собой отдельный элемент данных, но позже числовая информация была закодирована путем нумерации нижних строк от 0 до 9 с отметкой в ​​столбце, обозначающей номер строки. Позже алфавитные данные были закодированы, позволяя использовать более одного удара в столбце. Электромеханические счетные машины представляли внутреннюю дату по времени импульсов относительно движения карт через машину. Когда IBM перешла на электронную обработку, начиная с электронного умножителя IBM 603 , она использовала множество схем двоичного кодирования, привязанных к коду перфокарты.

Двоично-десятичное число IBM ( BCD ) — шестибитная схема кодирования, используемая IBM еще в 1953 году в своих компьютерах 702 [4] и 704 , а также в более поздних сериях 7000 и 1400 , а также в связанных с ними периферийных устройствах. Поскольку использовавшийся тогда код перфокарты допускал только цифры, заглавные английские буквы и несколько специальных символов, шести бит было достаточно. BCD расширил существующую простую четырехбитную числовую кодировку, включив в нее алфавитные и специальные символы, легко сопоставив ее с кодировкой перфокарты, которая уже широко использовалась. Коды IBM использовались в основном с оборудованием IBM; другие производители компьютеров той эпохи имели свои собственные коды символов, часто шестибитные, но обычно имели возможность читать ленты, созданные на оборудовании IBM. BCD был предшественником расширенного двоично-десятичного кода обмена IBM (обычно сокращенно EBCDIC), восьмибитной схемы кодирования, разработанной в 1963 году для IBM System / 360 , которая имела больший набор символов, включая строчные буквы.

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

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

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

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

Кодовые страницы

«Кодовая страница» — это историческое название набора кодированных символов.

Первоначально кодовая страница относилась к определенному номеру страницы в руководстве по стандартному набору символов IBM, который определял конкретную кодировку символов. [10] Другие поставщики, включая Microsoft , SAP и Oracle Corporation , также опубликовали свои собственные наборы кодовых страниц; наиболее известными наборами кодовых страниц являются « Windows » (на основе Windows-1252) и «IBM»/«DOS» (на основе кодовой страницы 437 ).

Несмотря на то, что в стандарте больше нет ссылок на конкретные номера страниц, многие кодировки символов по-прежнему обозначаются номером их кодовой страницы; аналогично, термин «кодовая страница» часто до сих пор используется для обозначения кодировок символов в целом.

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

Кодовые единицы

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

Кодовые точки

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

Персонажи

То, что именно представляет собой символ, варьируется в зависимости от кодировки символов.

Например, для букв с диакритическими знаками существует два различных подхода к их кодированию: они могут быть закодированы либо как один унифицированный символ (известный как заранее составленный символ), либо как отдельные символы, которые объединяются в один глиф . Первый упрощает систему обработки текста, а второй позволяет использовать в тексте любую комбинацию букв и диакритических знаков. Лигатуры создают аналогичные проблемы.

То, как именно обрабатывать варианты глифов , — это выбор, который необходимо сделать при построении конкретной кодировки символов. Некоторые системы письменности, такие как арабская и иврит, должны учитывать такие вещи, как графемы , которые в разных контекстах соединяются по-разному, но представляют один и тот же семантический символ.

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

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

Репертуар абстрактных символов (ACR) — это полный набор абстрактных символов, поддерживаемых системой. Unicode имеет открытый репертуар, а это означает, что со временем в репертуар будут добавляться новые символы.

Набор кодированных символов (CCS) — это функция , которая сопоставляет символы с кодовыми точками (каждая кодовая точка представляет один символ). Например, в данном репертуаре заглавная буква «А» латинского алфавита может быть представлена ​​кодовой точкой 65, символ «В» — 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 .

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

Модель Unicode использует термин «карта символов» для других систем, которые напрямую присваивают последовательность символов последовательности байтов, охватывая все уровни CCS, CEF и CES. [9]

Кодовые точки Юникода

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

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

Пример

Рассмотрим строку букв «ab̲c𐐀», то есть строку, содержащую объединяющий символ Юникода ( U+0332 ̲ ), а также дополнительный персонаж ( U+10400 𐐀 ). Эта строка имеет несколько представлений в Юникоде, которые логически эквивалентны, но каждое из них подходит для различных обстоятельств или ряда требований:

Обратите внимание, в частности, что 𐐀 представлен либо одним 32-битным значением (UTF-32), двумя 16-битными значениями (UTF-16) или четырьмя 8-битными значениями (UTF-8). Хотя каждая из этих форм использует одинаковое общее количество бит (32) для представления глифа, неочевидно, как связаны фактические числовые значения байтов.

Транскодирование

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

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

Окна :

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

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

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

  1. ^ «Определение кодировки символов» . Словарь технических терминов . 24 сентября 2010 г.
  2. Том Хендерсон (17 апреля 2014 г.). «Таблицы кодов символов древних компьютеров - и почему они все еще актуальны». Умный медведь . Проверено 29 апреля 2014 г.
  3. ^ Том Дженнингс (1 марта 2010 г.). «Аннотированная история некоторых кодов символов» . Проверено 1 ноября 2018 г.
  4. ^ «Предварительное информационное руководство по машинам электронной обработки данных IBM типа 702» (PDF) . 1954. с. 80. 22-6173-1. Архивировано (PDF) из оригинала 9 октября 2022 года.
  5. Стрелхо, Кевин (15 апреля 1985 г.). «IBM переводит жесткие диски на новые стандарты». Инфомир . Popular Computing Inc., стр. 29–33 . Проверено 10 ноября 2020 г.
  6. ^ abcd Шон Стил (15 марта 2005 г.). «В чем разница между кодировкой, кодовой страницей, набором символов и Юникодом?». Документы Майкрософт .
  7. ^ abcdefg «Глоссарий терминов Юникода». Консорциум Юникод.
  8. ^ ab «Глава 3: Соответствие». Стандарт Unicode версии 15.0 – Основная спецификация (PDF) . Консорциум Юникод. Сентябрь 2022 г. ISBN 978-1-936213-32-0.
  9. ^ abcde Уистлер, Кен; Фрейтаг, Асмус (11 ноября 2022 г.). «UTR № 17: Модель кодировки символов Юникода». Консорциум Юникод . Проверено 12 августа 2023 г.
  10. ^ «Информация о программисте видеотерминала VT510» . Корпорация цифрового оборудования (DEC). 7.1. Наборы символов — Обзор. Архивировано из оригинала 26 января 2016 года . Проверено 15 февраля 2017 г. В дополнение к традиционным наборам символов DEC и ISO , которые соответствуют структуре и правилам ISO 2022 , VT510 поддерживает ряд кодовых страниц IBM PC ( номера страниц в руководстве по стандартному набору символов IBM) в режиме PCTerm для эмуляции консольного терминала ПК отраслевого стандарта.
  11. ^ «Терминология (Уроки Java)» . Оракул . Проверено 25 марта 2018 г.
  12. ^ «Метод Encoding.Convert». Библиотека классов Microsoft .NET Framework .
  13. ^ «Функция MultiByteToWideChar (stringapiset.h)» . Документы Майкрософт . 13 октября 2021 г.
  14. ^ "Функция WideCharToMultiByte (stringapiset.h)" . Документы Майкрософт . 9 августа 2022 г.

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

Внешние ссылки