Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

Набор символов представляет собой набор символов, то есть "глифов", то есть визуальных символов, представляющих единицы связи. Буква 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 char установлено:

>> '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 хороши, если вы не хотите получать слишком рубиновый характер.

Ответ 3

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

Ответ 4

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

FWIW, в моем упрощенном виде

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

IMHO Wikipedia в настоящее время не помогает, определяя кодовую страницу как "другое имя для кодировки символов" и перенаправление "набора символов" на "кодировка символов"

Ответ 5

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