В чем разница между "кодировкой", "набором символов" и "кодовой страницей"?

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

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

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

5 ответов


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

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

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

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

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

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

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


набор символов-это набор символов, т. е. "глифы", т. е. визуальные символы, представляющие единицы коммуникации. Письмо 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 (base 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 хороши, если вы не хотите слишком специфичны для ruby.


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


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

чистки рядов, в моем использования слишком упрощенных вид

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

имхо Википедия В настоящее время не помогает, определяя страницу код как "другое имя для кодирования символов" и перенаправление "набора символов" на 'символ'


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