В чем разница между «кодированием», «набором символов» и «кодовой страницей»? - PullRequest
24 голосов
/ 09 августа 2010

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

Я прочитал статью Спольского , но мне все еще неясно, потому что эти три термина взаимозаменяемо используются МНОГО - даже в этой статье. Я думаю, что по крайней мере двое из них говорят об одном и том же.

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

Ответы [ 5 ]

34 голосов
/ 09 августа 2010

«Набор символов» - это то, что он говорит: правильно заданный список различных символов.

«Кодировка» - это отображение между набором символов (обычно Unicode сегодня) и (обычно байтом)на основе) технического представления символов.

UTF-8 является кодировкой, но не набором символов.Это кодировка набора символов Unicode (*).

Путаница возникает из-за того, что большинство других известных кодировок (например, ISO-8859-1) начинались как отдельные наборы символов.Затем, когда Unicode стал надмножеством большинства этих наборов символов, стало возможным думать о них как о различных (но частичных) кодировках одного и того же (Unicode) набора символов, а не просто как о изолированных наборах символов.Глядя на них таким образом, вы можете легко переходить между ними через Unicode, что было бы невозможно, если бы они были просто изолированными наборами символов.Но все же имеет смысл называть их наборами символов, поэтому можно использовать любой термин.

«Кодовая страница» - это термин, происходящий от IBM, где он выбирает, какой набор символов будет отображаться.Термин продолжал использоваться DOS, а затем Windows, вплоть до Unicode-ориентированной Windows, где он просто действует как кодировка с нумерованным идентификатором.В то время как пронумерованная «кодовая страница» является идеей, которая по сути своей не ограничена Microsoft, сегодня этот термин почти всегда означает просто кодировку, о которой знает Windows.

Когда кто-то говорит о кодовой страницеобычно говорят о кодировке, специфичной для Windows, в отличие от кодировки, разработанной органом по стандартизации.Например, кодовая страница 28591 обычно не упоминается под этим именем, а просто «ISO-8859-1».Специфичная для Windows западноевропейская кодировка, основанная на ISO-8859-1 (с несколькими дополнительными символами, заменяющими некоторые из ее управляющих кодов) обычно называется «кодовой страницей 1252».

[*: ВсеUTF - это кодировки, а не наборы символов, но такие вещи не являются исключительными для Unicode.Например, японский стандарт JIS X 0208 определяет для него набор символов и две разные кодировки байтов: несколько неприятное высокобайтовое кодирование ('Shift-JIS') и глубоко ужасающее кодирование на основе escape-переключения ('JIS«).]

6 голосов
/ 13 июля 2012

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

Я - программист ruby, поэтому вот несколько примеров, которые помогут вам понять концепции.

Это показывает, как Unicode отображает кодовые точки на символы, но не то, как хранится каждый байт.(ruby 1.9 по умолчанию соответствует строкам Unicode.)

>> 'a'.codepoints.to_a
=> [97]
>> '€'.codepoints.to_a
=> [8364]

Ниже показано, как кодировка UTF-8 сохраняет каждый символ в байтах (от 0 до 255 в base-10).(Кодировка Ruby 1.9 по умолчанию - UTF-8.) Поскольку 8364 (основание 10) слишком велико, чтобы уместиться в один байт, UTF-8 имеет специальную стратегию для разбиения его на несколько байтов.Википедия показывает алгоритм кодирования UTF-8, если вы хотите углубиться в реализацию.

>> 'a'.bytes.to_a
=> [97]
>> '€'.bytes.to_a
=> [226, 130, 172]

Вот то же самое в наборе символов ISO-8859-15:

>> 'a'.encode('iso-8859-15').codepoints.to_a
=> [97]
>> '€'.encode('iso-8859-15').codepoints.to_a
=> [164]

Икодировка ISO-8859-15:

>> 'a'.encode('iso-8859-15').bytes.to_a
=> [97]
>> '€'.encode('iso-8859-15').bytes.to_a
=> [164]

Обратите внимание, что кодовые точки ISO-8859-15 соответствуют представлению байтов.

Вот запись в блоге, которая может быть полезна: http://blog.grayproductions.net/articles/what_is_a_character_encoding.Записи с 1 по 3 хороши, если вы не хотите слишком привязываться к рубину.

5 голосов
/ 09 августа 2010

Набор символов - это просто набор символов, который можно использовать.
Каждый из этих символов отображается в целое число, называемое кодовой точкой.
То, как эти кодовые точки представлены в памяти, является кодировкой.Кодирование - это просто метод преобразования кодовой точки (U + 0041 - кодовая точка Unicode для символа «A») в необработанные данные (биты и байты).

4 голосов
/ 09 августа 2010

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

FWIW, в моем упрощенном представлении

  • Наборы символов (ASCII, EBCDIC, UNICODE) будут числовым представлением символов, независимо от соображений хранения
  • Кодировка будет относиться к эффективному хранению символов, ANSI, UTF-7, UTF-8 и т. Д.,для файла, по сети и т. д.
  • Кодовая страница была бы «ключом», необходимым, когда требование добавления новых символов (без увеличения объема памяти) означало, что (определенные) символы были доступны только вдополнительный контекст кодовой страницы.

IMHO Википедия в настоящее время не помогает, определяя кодовую страницу как «другое имя для кодировки символов» и перенаправляя «набор символов» на 'кодировка символов'

2 голосов
/ 09 августа 2010

Глава по Unicode в этой книге, Расширенное программирование на Perl содержит лучшее описание кодировки, наборов символов и других сущностей Unicode, с которыми я сталкивался. К сожалению, я не думаю, что он доступен бесплатно онлайн.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...