Путеводитель по Unicode для пустышки

Может ли кто-нибудь дать мне краткое определение

  • Юникод
  • UTF7
  • UTF8
  • UTF16
  • UTF32
  • Кодовые страницы
  • Чем они отличаются от Ascii/Ansi/Windows 1252

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


person Arec Barrwin    schedule 21.09.2009    source источник


Ответы (6)


Это хорошее начало: Абсолютный минимум, который каждый разработчик ПО обязательно должен знать о Unicode и наборах символов ( Никаких оправданий!)

person Tim    schedule 21.09.2009
comment
Единственное предостережение заключается в том, что некоторая информация устарела (юникод является движущейся целью), хотя ничего, что действительно должно интересовать спрашивающего. - person Kathy Van Stone; 21.09.2009
comment
На самом деле часто упоминаемая статья Джо неверна даже на дату публикации (2003 г.). Правильный UTF-8 не доходит до 6 байт (всего 4), есть такое понятие как обычный текст (не имеет отношения к кодировке), UCS не является жаргоном Unicode (это жаргон ISO), wchar_t и LHello нет обязательно Юникод. Но эй, он знает больше, чем другие, даже если что-то не так. Сообщение остается правильным :-) - person Mihai Nita; 12.11.2009
comment
@Mihai: ① UTF-8 может иметь до 6 байтов на символ, но в настоящее время требуется только до 4. В таблице Джоэла это совершенно ясно. ② Что такое «обычный текст»? Простой текст ASCII? ③ нет возражений по поводу UCS и источника жаргона ④ (придирки :) wchar_t и L"Hello" всегда Unicode, явно закодированные. Конечно, даже "Mihai Nita" — это Unicode, закодированный как ASCII, или ISO8859-1, или CP1252, или даже CP1253, или... - person tzot; 09.03.2011
comment
@tzot UTF-8 может занимать до 6 байтов на символ: такая кодировка не соответствует UTF-8, как определено, и это так, начиная с Unicode 3 (unicode.org/faq/utf_bom.html#utf8-4). - person Mihai Nita; 19.04.2012
comment
@tzot wchar_t и LHello всегда имеют Юникод: не в соответствии со стандартами C/C++. Ширина wchar_t зависит от компилятора и может составлять всего 8 бит. Следовательно, программы, которые должны быть переносимы между любыми компиляторами C или C++, не должны использовать wchar_t для хранения текста Unicode. Тип wchar_t предназначен для хранения определяемых компилятором расширенных символов, которые в некоторых компиляторах могут быть символами Unicode. en.wikipedia.org/wiki/Wide_character#C.2FC.2B. 2Б - person Mihai Nita; 19.04.2012
comment
@tzot даже Михай Нита - это Unicode, закодированный как ASCII, или ISO8859-1, или CP1252, или даже CP1253. Неправильно. Когда что-то закодировано как CP1252, это больше не Unicode. Любой символ может быть представлен как Unicode, некоторые могут быть представлены как CP1252. И Unicode, и cp1252 — это способы присвоения цифр символам. Может перекрываться или нет (например, знак евро находится в 80h в cp1252, но U+20AC в Unicode). Это немного похоже на число 12, представленное в различных системах счисления: 0x0C шестнадцатеричное, 12 дес, 014 восьмеричное. 12 это число и это абстракция. Вы не можете сказать, что 12 — это десятичное число, закодированное как шестнадцатеричное или восьмеричное. - person Mihai Nita; 19.04.2012
comment
@MihaiNita «Любой символ может быть представлен как Unicode». Нет, любой символ либо включен в какую-то версию Unicode и последующие, либо нет. Вы говорите так, как будто считаете, что Unicode означает кодировку UCS-2, точно так же, как Microsoft подразумевает в своих операционных системах. Да, «и Unicode, и CP1252 — это способы присвоения чисел символам», но только CP1252 — это способ кодирования символов в байты. Юникод и UCS-4/UTF-32 — это не одно и то же. - person tzot; 19.04.2012
comment
utf8everywhere.org — отличное продолжение статьи Джоэла о том, что вы действительно должны делать в своем приложении. - person Pavel Radzivilovsky; 09.09.2012

Если вам нужно действительно краткое введение: Unicode за 5 минут

Или, если вам нужны однострочники:

  • Unicode: сопоставление символов с целыми числами ("кодовыми точками") в диапазоне от 0 до 1 114 111; охватывает почти все используемые письменные языки
  • UTF7: кодирование кодовых точек в поток байтов со сброшенным старшим битом; вообще не использовать
  • UTF8: кодирование кодовых точек в поток байтов, где каждый символ может занимать один, два, три или четыре байта для представления; должен быть вашим основным выбором кодировки
  • UTF16: кодирование кодовых точек в поток слов (16-битные единицы), где каждый символ может занимать одно или два слова (два или четыре байта) для представления
  • UTF32: кодирование кодовых точек в виде потока 32-битных единиц, где каждый символ занимает ровно одну единицу (четыре байта); иногда используется для внутреннего представления
  • Кодовые страницы: система в DOS и Windows, в которой символы назначаются целым числам и соответствующей кодировке; каждый охватывает только подмножество языков. Обратите внимание, что эти назначения обычно отличаются от назначений Unicode.
  • ASCII: очень распространенное назначение символов целым числам и прямое кодирование в байты (все старшие биты очищены); назначение - это подмножество Unicode, а кодировка - подмножество UTF-8.
  • ANSI: орган по стандартизации.
  • Windows 1252: широко используемая кодовая страница; он похож на ISO-8859-1 или Latin-1, но не то же самое, и их часто путают.

Почему тебе не все равно? Потому что, не зная используемого набора символов и кодировки, вы на самом деле не знаете, какие символы представляет данный поток байтов. Например, байт 0xDE может кодировать

  • Þ (ЛАТИНСКАЯ ЗАГЛАВНАЯ БУКВА ТОРН)
  • fi (ЛАТИНСКАЯ МАЛАЯ ЛИГАТУРА FI)
  • ή (СТРОЧНАЯ ГРЕЧЕСКАЯ БУКВА ЭТА С ТОНОСОМ)
  • или 13 других символов, в зависимости от используемой кодировки и набора символов.
person MtnViewMark    schedule 22.09.2009

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

person Jon Skeet    schedule 21.09.2009


Да, у меня есть некоторое представление, но оно может быть неправильным, однако это помогло мне понять это.

Давайте просто возьмем текст. Он хранится в оперативной памяти компьютера в виде последовательности байтов, а кодовая страница — это просто таблица сопоставления между байтами и символами, которые мы с вами читаем. Итак, что-то вроде блокнота приходит со своей кодовой страницей и переводит байты на ваш экран, и вы видите кучу мусора, перевернутые вопросительные знаки и т. д. Это не означает, что ваши данные искажены, просто приложение, считывающее байты, не использует правильный кодовая страница. Некоторые приложения лучше других определяют правильную кодовую страницу для использования, и некоторые потоки байтов в памяти содержат спецификацию, которая обозначает метку порядка байтов, и это может объявить правильную кодовую страницу для использования.

UTF7, 8 16 и т. д. — это просто разные кодовые страницы, использующие разные форматы.

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

Они также не очень отличаются от Windows 1252, поскольку это просто еще одна кодовая страница.

Для лучшего умного ответа попробуйте одну из ссылок.

person Robert    schedule 21.09.2009

Другие уже указали достаточно хорошие ссылки для начала. Я привожу не настоящее руководство для чайников, а несколько указателей со страницы Консорциума Unicode. Вы найдете еще несколько важных причин использования разных кодировок на страницах Консорциума Unicode.

Часто задаваемые вопросы по Unicode — достаточно хорошее место, чтобы ответить на некоторые (не все) ваши вопросы.

Более краткий ответ о том, почему Unicode существует, представлен в разделе для новичков на веб-сайте Unicode себя:

Unicode предоставляет уникальный номер для каждого символа, независимо от платформы, программы и языка.

Что касается технических причин использования UTF-8, UTF-16 или UTF-32, то ответ заключается в Техническое введение в Unicode:

UTF-8 популярен для HTML и подобных протоколов. UTF-8 — это способ преобразования всех символов Unicode в кодировку байтов переменной длины. Его преимущества заключаются в том, что символы Unicode, соответствующие знакомому набору ASCII, имеют те же значения байтов, что и ASCII, и что символы Unicode, преобразованные в UTF-8, могут использоваться с большей частью существующего программного обеспечения без обширной перезаписи программного обеспечения.

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

UTF-32 популярен там, где объем памяти не важен, но желателен доступ к символам с фиксированной шириной и единым кодом. Каждый символ Unicode кодируется в одной 32-битной кодовой единице при использовании UTF-32.

Все три формы кодирования требуют максимум 4 байта (или 32 бита) данных для каждого символа.

Общее эмпирическое правило состоит в том, чтобы использовать UTF-8, когда преобладающие языки, поддерживаемые вашим приложением, говорят к западу от реки Инд, UTF-16 для противоположного (восточнее Инда) и UTF-32, когда вы беспокоитесь об использовании символов с равномерным хранением.

Кстати, UTF-7 не является стандартом Unicode и был разработан в первую очередь для использования в почтовых приложениях.

person Vineet Reynolds    schedule 21.09.2009
comment
Учтите, что если текст в вашем приложении хранится с разметкой (HTML, XML или другой подобной), то часто UTF-8 оказывается более эффективной даже для азиатских языков. Например, при работе в Интернете совершенно разумно использовать единообразное использование UTF-8 во всем рабочем процессе. - person MtnViewMark; 22.09.2009
comment
Да, я согласен с этим понятием для работы с сетью. Однако для толстых клиентов, написанных на C/C++ и т. д., UTF-16 обычно имеет смысл для азиатского языкового рынка. - person Vineet Reynolds; 22.09.2009