User Tools

Site Tools


charencodings

Начнем с базового вопроса: как можно представить национальный язык в компьютере? Важно различать три понятия: алфавит, кодирование алфавита и конкретное представление кодировки.

  • Алфавит - это собрание букв языка. С русским языком все понятно - а-я и А-Я.
  • Кодирование алфавита. В компьютерах все представляется числами. Естественное желание - представить набор символов, которые можно показывать, числами - кодами символов. Самая популярная кодировка - ASCII. В ASCII представлены цифры, латинские буквы и символы пунктуации. Все вместе укладывается в диапазон кодов 0-127. Все прочие буквенные языки (в которых буква приблизительно соответствует звуку, а не слогу или слову) обычно отображали свои символы в диапазон 128-255. В 90-х годах был предложен мировой стандарт unicode, где каждому языку был присвоен диапазон (кодовая страница) в рамках которой располагались буквы. На всех был выделен достаточно большой диапазон чтобы запихнуть в него все.
  • Представление кодировки. Желание сократить размер, выделяемый под текст привело к хитростям в представлении символов в компьютере. Порядковые номера большинства символов unicode попадают в интервал 0-65535. Для представления таких чисел достаточно двух байт. Логичным способом представления такой строки является последовательность двухбайтовых чисел, содержащих коды символов. Такое представление называется UTF-16 и часто путается с собственно unicode, что неправильно: UTF-16 всего лишь одно из возможных представлений юникода, не позволяющее отобразить все символы стандарта. Для английского языка UTF-16 будет похож на ASCII текст, в котором каждый второй символ будет нулевым. Для экономии был предложено представление UTF-8, в котором ASCII символы представляются 1 байтом, а все национальные алфавиты - двумя или тремя байтами. Таким образом разные представления могут соответствовать одной кодировке. Представление кодировки важно для понимания какая последовательность символов соответствует данной последовательности байт.

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

Рассмотрим эволюцию не-unicode представлений кодировок.

  • ASCII кодировка. Символы уложились в диапазон 0-127 (7 бит). Восьмой бит планировался как бит четности.
  • Бит четности скоро перестал быть важен и стал использоваться для национальных алфавитов. Европейские страны засунули в диапазон 128-255 свои символы с акцентами (ISO Latin charset, она же Windows-1252), Россия (СССР) использовала этот же диапазон для кириллицы (традиционно было предложено несколько несовместимых кодировок: ГОСТ, альтернативная 866, KOI-8R, а победила, естественно, кодировка от Microsoft Windows-1251).
  • Страны, которым не хватало 128 дополнительных символов (азиатские страны со слоговым и иероглифическим письмом), придумали мультибайтовую кодировку. В отличии от предыдущих кодировок, где было соответствие один символ - один байт, мультибайтовые кодировки могли кодировать символ в нескольких байтах. Обычные символы из ASCII кодировались одним символом, а некоторые коды из старшей половины использовались как стартовые символы для двух-трех байтовых символов. До мультибайтовых кодировок все было просто: 5 байт - 5 символов. Теперь для подсчета числа символов нужно было просканировать строку. Понятно, что ожидать от европейского (и русского) программиста корректной работы с мультибайтовыми символами практически невозможно. Разве что по случайности.
  • Как можно правильно распознать поток байт как текст? Было введено понятие кодовой страницы, codepage. Текущая кодовая страница указывала на способ распознавания символов. Так, Словоед, используя переключение кодовой страницы в Пилоке, способен выводить и русские буквы и немецкие умляуты.

Теперь мы можем сформулировать принцип работы PalmOS с текстами: PalmOS поддерживает в качестве текущей мультибайтовую (как частный вид - однобайтовую) кодировку. Начиная с 4 версии, PalmOS упрощает поддержку национальной кодировки.

Чем плохи мультибайтовые кодировки? Тем, что для одновременного использования различных национальных алфавитов требуется внешний механизм переключения кодировок (кодовой страницы). Стандарт Unicode включает кодовую страницу в код каждого символа. Тем самым упрощается совместное использование разных языков, но существенно увеличивается размер кода символа.

UTF-16 использует 2 байта для представления каждого символа. При этом unicode символы большие чем 0x10FFFF (кто бы сказал что там за символы?) в этом представлении использовать нельзя. Подробности здесь ftp://ftp.rfc-editor.org/in-notes/rfc2781.txt .

UTF-8 пользуется тем, что кодовая страница 0 совпадает с ASCII. При этом ASCII-символы представлены одним байтом, а остальные кодируются аналогично мультибайтовым кодировкам (при этом сложность работы с русским приравнена к сложности работы с восточными языками. ха-ха.). Подробности здесь ftp://ftp.rfc-editor.org/in-notes/std/std63.txt .

Чем неудобен unicode для русского языка на пальме?

  • Во-первых в PalmOS существует только одна функция, которая понимает юникод и преобразовывает его в мультибайтовую родную кодировку. Мало довода?
  • Во-вторых русификатор должен правильно настроить функции преобразования. На голой машине эти преобразования будут заведомо неверными.
  • В-третьих редкая программа, которая обрабатывает поток текста озабачивается настраиваемым списком понимаемых кодировок.
  • В-четвертых вменяемый европейский программист просто будет рассматривать UTF-8 как ASCII, а в UTF-16 будет просто выкидывать старший байт. Их можно понять ;-).
charencodings.txt · Last modified: 2004/01/20 17:33 by 127.0.0.1