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

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

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

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

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

Содержание

  • 1 История
  • 2 Терминология
  • 3 Модель кодирования Unicode
  • 4 Наборы символов, карты символов и кодовые страницы
  • 5 Перевод кодировки символов
  • 6 См. Также
    • 6.1 Общие кодировки символов
  • 7 Ссылки
  • 8 Дополнительная литература
  • 9 Внешние ссылки

История

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

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

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

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

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

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

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

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

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

Репертуар символов представляет собой абстрактный набор из более чем одного миллиона символов, встречающихся в самых разных сценариях, включая латинские, Кириллица, китайский, корейский, японский, иврит и арамейский.

Другие символы, такие как ноты, также включены в репертуар персонажей. Стандарты Unicode и 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).

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

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

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

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

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

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

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

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

A набор кодированных символов (CCS) - это функция , которая отображает символы в кодовые точки (каждая кодовая точка представляет один символ). Например, в данном репертуаре заглавная буква «A» в латинском алфавите может быть представлена ​​кодовой точкой 65, символом «B» - 66 и так далее. Несколько наборов кодированных символов могут иметь один и тот же репертуар; например, ISO / IEC 8859-1 и кодовые страницы 037 и 500 IBM охватывают один и тот же репертуар, но отображают их в разные кодовые точки.

A Форма кодирования символов (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 и Punycode ).

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

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

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

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

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

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

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

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

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

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

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

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

Кросс-платформенный :

  • Веб-браузеры - большинство современных веб-браузеров поддерживают автоматическое определение кодировки символов. В Firefox 3, например, см. Подменю View / Character Encoding.
  • iconv - программа и стандартизованный API для преобразования кодировок
  • luit - программа, которая преобразует кодировку ввода и вывода в программы, работающие в интерактивном режиме
  • convert_encoding.py - Утилита на основе Python для преобразования текстовых файлов между произвольными кодировками и окончаниями строк.
  • decodeh.py - алгоритм и модуль для эвристического угадывания кодировки строки.
  • Международный Компоненты для Unicode - набор библиотек C и Java для преобразования кодировки. uconv можно использовать из ICU4C.
  • chardet - это перевод кода автоматического обнаружения кодирования Mozilla на компьютерный язык Python.
  • Более новые версии команда Unix file пытается выполнить базовое определение кодировки символов (также доступно в Cygwin ).
  • charset - C ++ библиотека шаблонов с простым интерфейсом для преобразования между C ++ / пользовательские потоки. Charset определяет множество наборов символов и позволяет использовать форматы Unicode с поддержкой endianness.

Unix-like :

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

Windows :

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

См. Также

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

Ссылки

Дополнительная литература

  • Маккензи, Чарльз Э. (1980). Наборы кодированных символов, история и развитие. Серия системного программирования (1 изд.). Addison-Wesley Publishing Company, Inc. ISBN 978-0-201-14460-4. LCCN 77-90165.

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

Wikimedia Commons имеет m edia, относящегося к Наборы символов.
Последняя правка сделана 2021-05-14 06:08:04
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте