Почему «кодировка» действительно означает «кодирование» в обычном использовании?

10

Что-то, что меня давно смущало, так это то, что многие программы используют термины «кодировка» и «кодировка» в качестве синонимов.

Когда люди ссылаются на «кодировку» Юникода, они всегда имеют в виду набор правил для представления символов Юникода в виде последовательности байтов - например, ASCII или UTF-8. Это кажется разумным и интуитивным; идея заключается в том, что вы «кодируете» эти символы в виде байтов, используя указанный набор правил.

Поскольку эти наборы правил иногда предоставляют только возможность «кодировать» некоторое подмножество всех символов Юникода, вы можете себе представить, что «кодировка» - сокращение от «набора символов» - будет просто означать набор символов Юникода - без учета того, как эти символы закодированы. Таким образом, кодирование подразумевает набор символов (кодировка, подобная ASCII, в которой есть только правила для кодирования 128 символов, будет связана с набором символов из этих 128 символов), но набор символов не должен подразумевать кодирование (например, UTF-8, UTF). -16 и UTF-32 - все разные кодировки, но могут кодировать один и тот же набор символов).

И все же - и в этом суть моего вопроса - использование слова «кодировка» в реальном мире не соответствует тому, что подразумевает конструкция этого слова. Это почти всегда используется для обозначения «кодирования».

Например:

  • charsetАтрибут в HTML используется для указания кодировки
  • Charsetв Java это кодировки
  • charsets и character setsв MySQL, опять же, кодировки

Сколько лет этому любопытному (ab) использованию языка и как появилось это нелогичное определение «кодировки»? Есть ли возможно , происходит от времени , когда действительно был , на практике, отображение взаимно-однозначное соответствие между кодировками в использовании и наборами символов они поддерживаются? Или был какой-то особенно влиятельный стандарт или спецификация, которая диктовала это определение слова?

Марк Эмери
источник
5
Использование charsetпредшествует стандарту Unicode, поэтому, хотя это и не было «однозначным отображением», символы, необходимые для документа, обычно приводили к выбору кодировки. Но у меня нет времени исследовать реальную историю слова ...
AmeliaBR
2
Вы говорите о наборах символов как о «наборе символов Unicode», как будто кто-то начал с Unicode, а затем выбрал подмножества. Точнее сказать, что многие наборы символов существовали до изобретения Unicode (или, по крайней мере, до того, как Unicode стал повсеместным), и Unicode намеренно создан, чтобы быть их надмножеством.
Джон Варфоломей

Ответы:

3

Концепция наборов символов старше, чем Unicode.

До Unicode набор символов определял набор символов и то, как каждый символ был представлен в битах. Большинство наборов символов сопоставляют символ с байтом (который допускает набор из 256 символов), некоторые сопоставляются с двумя байтами, а некоторые (например, ASCII) - только с 7 битами. Разные наборы символов часто назначают разные значения одному и тому же символу, и не было универсального ключа перевода между различными используемыми наборами символов.

Юникод был попыткой решить эту проблему, объединив все различные наборы символов в общий «суперсет». Для этой цели в Юникоде были введены некоторые дополнительные уровни абстракции, например, концепция кодировки символов как нечто отдельное от значений кодовых точек. Это позволило Unicode переопределить наборы символов до Unicode как кодировки символов Unicode.

Например, атрибут charset в HTML (который отражает параметр charset в заголовке типа содержимого HTTP) возник еще до того, как юникод получил широкое распространение, но когда было решено принять юникод в качестве универсального набора символов в Интернете, атрибут charset было просто переопределено, чтобы указать используемую кодировку , но имя не было изменено, чтобы обеспечить обратную совместимость.

JacquesB
источник
9

Термин «кодировка», конечно, является сокращением от «набора символов», который, в свою очередь, является старым термином, используемым для кодировки символов, который можно интерпретировать как а) отображение между последовательностями байтов и символов, б) отображение между целыми числами (кодовые номера) и символы или c) отображение между абстрактными символами и целыми числами или последовательностями байтов.

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

Больше всего имело значение то, что этот идентификатор charsetбыл принят в MIME и HTTP. HTTP 1.0 псевдоним RFC 1945 цитирует определение MIME, «метод, используемый с одной или несколькими таблицами для преобразования последовательности октетов в последовательность символов», а затем комментирует путаницу: «Это использование термина« набор символов »более обычно упоминается как «кодировка символов». Однако, поскольку HTTP и MIME совместно используют один и тот же реестр, важно, чтобы терминология также была общей ».

Юкка К. Корпела
источник
1

RFC2045 ввел «набор символов» в MIME, и к тому времени уже было ясно, что не все кодировки отображают один символ в один октет. RFC2130 обсуждает эту историю немного подробнее.

По сути, «кодировка» была более популярным термином, когда были написаны эти стандарты, она более лаконична, чем «кодировка символов» или «схема кодирования текста», и менее двусмысленна, чем «кодировка».

Стив Клэй
источник
Мне кажется, что параметр 'charset' уже присутствовал в RFC 1341 (июнь 1992 г.).
Джон Варфоломей
1

Существует как минимум 2 кодировки, применимые к передаче текста. Кодировка символов описывает, как символы (глифы) кодируются. Все языки используют подмножество набора символов UCS, которые часто кодируются в 8-битное значение. Стандартизированные наборы символов имеют стандартные кодировки символов, и термины обычно используются взаимозаменяемо.

Кодировка передачи описывает, как передается текст, и, как правило, не зависит от кодировки символов. Большинство кодировок передачи не прозрачны и изменяют последовательность передаваемых байтов. 8-битное кодирование передачи прозрачно для 8-битных кодировок. 7-битное кодирование передачи может передавать только 7-битные наборы символов, такие как ASCII

ASCII использует 95 печатаемых символов и еще несколько символов для управления кареткой (перевод строки, перевод формы, возврат каретки, возврат на одну позицию и табуляции), закодированных в 7 битах. Существуют дополнительные управляющие символы, использующие оставшиеся значения. ASCII является правильным подмножеством наборов символов UCS, а также многих из 8-битных наборов символов. ISO-8859-1 также является правильным подмножеством набора символов UCS, но эти символы имеют различную кодировку в UTF-8, который использует несколько байтов для значений символов, превышающих 127.

Мэйнфреймы IBM используют (d) EBCDID, который использовал другую 8-битную кодировку. Существуют таблицы перевода, которые отображают печатаемые символы между кодировками символов ASCII и ECBDIC. ECBDIC имеет больший набор символов, чем ASCII, потому что он имеет знаки препинания, недоступные в ASCII. Это может предотвратить полное преобразование в обе стороны между этими двумя кодировками, если начальная кодировка является ECBDIC.

Этого кодирования было недостаточно для языков с символами, не охватываемыми печатными символами ASCII. Microsoft и другие использовали 8-битные расширения для набора символов ASCII и кодировали дополнительные символы со значениями выше 127. Одного расширения было недостаточно для всех языков, поскольку эти расширения добавляли в набор символов до 96 символов. Это привело к тому, что несколько наборов символов (наборов символов) используются для разных языков с разным 8-битным кодированием символов Эти наборы символов включают символы, необходимые для этого языка или языковой семьи. Дополнительные символы могут быть закодированы в разные значения в разных кодировках. Английские пользователи, скорее всего, заметят это с помощью расширенных знаков препинания (кавычки слева и справа и тире), которые отображаются неправильно, если используется неправильный набор символов.

Для однобайтовых кодировок могут кодироваться только символы в наборе символов. Некоторые языки требуют многобайтовых кодировок, чтобы покрыть их набор символов. Набор символов Unicode (UCS) требует многобайтовых кодировок для символов вне набора символов ASCII. Этот набор символов является надмножеством всех языковых кодировок. UTF-8 - это компактная кодировка набора символов UCS. ASCII не требует дополнительных байтов, и большинство (все?) Символов европейского языка могут быть закодированы как один или два байта. Полный набор символов UCS-2 может быть закодирован в один-три байта. Все символы в текущем наборе символов UCS могут быть закодированы в один-четыре байта.

BillThor
источник
0

FWIW, IIRC, Назад в Commodore 64 дня, набор символов был функцией от {0, ... 255} до набора всех черно-белых изображений uxv, где u и v были, возможно, 8 и 12. Так что «меняя «набор символов» означает использование команды POKE на языке BASIC для изменения областей памяти, предназначенных для хранения этих изображений. Например, ASCII-код 65 означает A, и изображение A будет сохранено, начиная с адреса памяти a * 65 + b для некоторого b, и я предполагаю, что a = u * v.

Бьёрн Кьос-Ханссен
источник