Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

CHARSET и его имя.

    Давайте теперь рассмотрим такой вопрос : каким образом выбирается имя для определенного Charset-а ?

    Во-первых, зачем нам требуются имена Charset-ов ?

  • В стандарте HTTP определено поле charset:
    text/plain; charset="koi8-r"
    text/html; charset="koi8-r"
  • В стандарте MIME имя Charset-а применяется при кодировании заголоков :
    Subject: Re: =?KOI8-R?Q?=C1?=
  • В POSIX locale имя Charset-а входит в название категорий локализации :
    $ export LANG=ru_RU.KOI8-R

    Таким образом, каждый Charset должен иметь определенное имя. (Технически, имя - это строка символов.)

    К сожалению, в деле стандартизации имен Charset-ов царит некоторый беспорядок. А проблема состоит в том, что в настоящее время не существует строгого стандарта на имена Charset-ов.

    Например,  даже в стандарте ISO для Charset-ов семейства ISO-8859 определено все : состав символов, e.t.c., но совершенно не определены правила написания имени. Поэтому, даже для имен из стандарта ISO возможны варианты записи:

ISO8859-1
ISO-8859-1
ISO_8859-1
и т.д.
Обратите внимание на символ между буквами ISO и цифрами.

    Однако существует другая организация : IANA, которая кроме всего прочего занимается и регистрацией Charset-ов . Там, на IANA лежит документ : http://www.isi.edu/in-notes/iana/assignments/character-sets.

    В данном документе определено следующее : The character set names may be up to 40 characters taken from the printable characters of US-ASCII. However, no distinction is made between use of upper and lower case letters. (Имя набора символов может достигать 40 символов ASCII. Не существует разницы между строчными и прописными буквами) Это практически все, что можно сказать о правилах образования имен Charset-ов.

     Однако самое полезное в этом документе то, что в нем определено понятие Alias у Сharset.

Name: ISO_8859-1:1987
MIBenum: 4
Source: ECMA registry
Alias: iso-ir-100
Alias: ISO_8859-1
Alias: ISO-8859-1 (preferred MIME name)
Alias: latin1
Alias: l1
Alias: IBM819
Alias: CP819
Alias: csISOLatin1

    Определена также процедура регистрации новых Charset-ов : RFC-2278 : "IANA Charset Registration Procedures." Существует список рассылки ietf-charsets@iana.org (архив списка доступен здесь).

    Также неплохо ознакомиться с RFC-2130. "The Report of the IAB Character Set Workshop held 29 February - 1 March, 1996". RFC-2277 "IETF Policy on Character Sets and Languages" и RFC-2184.

    Довольно обширная подборка документов находится здесь : http://www.nada.kth.se/i18n/iab-charsets/. См. также коллекцию Charmap-ов от DKUUG и UNICODE.

    Но к сожалению, данный документ IANA не является международным стандартом, а всего лишь "подборка рекомендаций"... И названия Charset, в отличии от названий Country и Territory (ISO 639 и ISO 3166) для имен locale, HTTP и MIME  не стандартизованы в ISO...

    Может быть поэтому многие авторы программного обеспечения не поддерживает Charset-ы или механизм Alias:-ов... Например glibc (автор Ulrich Drepper) и XFree . Вместо этого например в glibc существует специальный механизм, так называемый name mangling. То есть все символы в имени Charset-а переводятся в lowercase и удаляются все символы "-", "-", "."  e.t.c. Например "ISO_8859-1" становится "iso88591". А "KOI8-R" --> "koi8r".

    Ситуация осложняется тем, что когда-то давно IBM и Microsoft ввели понятие Codepage, которое теперь фактически имеет значение Charset. А с названиями этих самых Codepages стоит полная путанница :

CP866
CP-866
IBM866
IBM_866
и т.д.

    Или даже как в случае кодовой страницы CP1251, когда в Microsoft Internet Explorer или IIS эта кодировка фигурирует как "Windows-1251". Дак вот, схема name mangling по Drepper-у еще как-то работает для ISOxxxx, но совершенно не работает для имен Codepages CP-xxx/IBM-xxx/Windows-xxx. То есть, нужна поддержка Alias:-ов по IANA.

    Вобщем, засада с этим Charset-ом полная.

    Более того, в "чистом" POSIX вообще невозможно узнать имя Charset текущей локализации. См. Критику POSIX.

    Ситуация даже еще хуже, поскольку для полной поддержки Charset-ов необходимо держать несколько копий man-ов, info и message catlog-ов (см. NLS) в разных кодировках. То есть, установив LANG=ru_RU.ISO_8859-5 пользователь вправе рассчитывать, что обработка символов, сообщения об ошибках и вывод справочной информации man будет происходить на русском языке в наборе символов ISO_8859-5. А установив LANG=ru_RU.KOI8-R пользователь точно так же вправе рассчитывать, что всю информацию он будет получать также на русском языке, но в кодировке KOI8-R.

    Точно так же для японского языка. Поскольку для японского имеется по крайней мере 4 кодировки : ISO-2022-JP, JIS, Shift-JIS (CP-932) и EUC, то установив LANG=ja_JP.EUC пользователь по-видимому желает работать в кодировке EUC, а установив LANG=ja_JP.Shift-JIS -- в кодировке Shift-JIS.

P.S Одна из редких программ, которая поддерживает Charset-ы "по настоящему" и даже имеет настройки charset.alias -- это mutt : http://www.mutt.org.

P.P.S. Решением проблемы был бы UNICODE как "самый универсальный сharset". Тогда любой другой Charset можно получить из UNICODE как "логическое сечение". Кстати в последних Solaris-ах есть такая возможность и можно определять LANG= en_US.UNICODE, ja_JP.UNICODE, ru_RU.UNICODE e.t.c.

P.P.P.S. К сожалению, X-ы "внутри" не UNICODE-овые и не имеют такого понятия как UNICODE font (в отличие от тех же Windows'95). А как было бы все тогда просто...


Содержание "Locale AS IT IS"


Last change : 27-08-1999