CHARSET и его имя, или Do you forget about Charset ?
Как оказывается, множество пользователей и программистов никогда не задавались таким простым вопросом : каково имя собственного Charset-а. Почему ? А дело в том, что для большинства языков употребляется только один Charset. Например, для Америки en_US
- Сharset будет однозначно ASCII, а для Франции fr_FR - Charset будет однозначно ISO-8859-1. И т.д.
Давайте не будем уподобляться и рассмотрим такой вопрос : Зачем нам нужно знать Charset
и каким образом выбирается имя
для определенного Charset-а ?
Во-первых, зачем нам требуются имена Charset-ов ?
:
Content-Type: text/plain; charset="koi8-r"
Content-Type: text/plain; charset="koi8-r"
Content-Type: text/html; charset="koi8-r"
Subject: Re: =?KOI8-R?Q?=C1?=
$ 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 и цифрами.
Однако существует другая организация : , которая кроме всего прочего занимается и регистрацией Charset-ов . Там, на IANA лежит документ : .
В данном документе определено следующее : 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 |
Также неплохо ознакомиться с :
Довольно обширная подборка документов находится здесь : . См. также коллекцию Charmap-ов от и .
Но к сожалению, данный документ не является
международным стандартом, а всего лишь "подборка рекомендаций"... И названия
Charset, в отличии от названий Country () и Territory
() для имен , HTTP и MIME не стандартизованы в ISO...
Может быть поэтому многие авторы программного обеспечения не поддерживает Charset-ы или механизм Alias:-ов... Например (автор Ulrich Drepper) и XFree86 . Вместо этого например в glibc существует специальный механизм, так называемый name mangling. То есть все символы в имени Charset-а переводятся в lowercase и удаляются все символы "_", "-", "." e.t.c. Например "ISO_8859-1" превращается в "iso88591". А "KOI8-R" --> "koi8r".
Ситуация осложняется тем, что когда-то давно IBM и Microsoft ввели понятие , которое теперь фактически имеет значение Charset. А с названиями этих самых Codepages стоит полная путанница :
CP866 |
CP-866 |
IBM866 |
IBM_866 |
и т.д. |
Windows-1251 |
Win-1251 |
CP1251 |
CP-1251 |
и т.д. |
Вобщем, засада с этим Charset-ом полная.
Более того, в "чистом" POSIX
вообще невозможно
узнать имя Charset текущей локализации. См. .
Ситуация даже еще хуже, поскольку для полной поддержки Charset-ов необходимо держать несколько копий man-ов, info и message catlog-ов (см. ) в разных кодировках. То есть, установив 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 : .
P.P.S. Решением проблемы был бы UNICODE как "самый универсальный сharset". Тогда любой другой Charset можно получить из UNICODE
как "логическое сечение". Кстати в последних Solaris-ах есть такая возможность и можно определять en_US.UNICODE, ja_JP.UNICODE, ru_RU.UNICODE e.t.c.
P.P.P.S. К сожалению, X-ы "внутри" не UNICODE-овые и не имеют такого понятия как UNICODE font (в отличие от тех же ). А как было бы все тогда просто...
Содержание ""