2010-08-09 3 views
16

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

Я читал Spolsky's article, но я до сих пор неясно, потому что эти три условия используются в качестве замены LOT - даже в этой статье. Я думаю, что по крайней мере двое из них говорят об одном и том же.

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

ответ

27

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

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

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») и глубоко ужасающее кодирование на основе перехода («JIS» «).]

5

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

1

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

+1

У меня есть подписка на Safari. Просто скачайте эту главу, спасибо. – Deane

+0

тоже здесь с подпиской на сафари :-) спасибо, хорошо смотрится –

3

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

FWIW, на мой oversimplistic зрения

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

ИМХО Википедия в настоящее время не помогает вещи, определяя code page как «другое название кодировки символов» и перенаправлять «набор символов» для 'character encoding'

+0

IMHO, нет такой кодировки ANSI. Имя «ANSI» является неправильным. – nn0p

6

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

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

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

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

Ниже показывает, как UTF-8 кодирования сохраняет каждый символ в виде байтов (0 через 255 в базе-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 являются хорошими, если вы не хотите получать слишком рубиновый характер.

Смежные вопросы