CHARSET и его имя, или Do you forget about Charset ?
Как оказывается, множество пользователей и программистов никогда не задавались таким простым вопросом : каково имя собственного Charset-а. Почему ? А дело в том, что для большинства языков употребляется только один Charset. Например, для Америки en_US
- Сharset будет однозначно ASCII, а для Франции fr_FR - Charset будет однозначно ISO-8859-1. И т.д.
Давайте не будем уподобляться и рассмотрим такой вопрос : Зачем нам нужно знать Charset
и каким образом выбирается имя
для определенного Charset-а ?
Во-первых, зачем нам требуются имена Charset-ов ?
В стандарте MIME у Content-Type: определен параметр Charset
:
Content-Type: text/plain; charset="koi8-r"
В стандарте HTTP также определен параметр Charset :
Content-Type: text/plain; charset="koi8-r"
Content-Type: text/html; charset="koi8-r"
В стандарте имя 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 и цифрами.
Однако существует другая организация : , которая кроме всего прочего занимается и регистрацией 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
|
Определена также процедура регистрации новых
Charset-ов : : "IANA Charset Registration Procedures." Существует список рассылки (архив списка ).
Также неплохо ознакомиться с :
. "The Report of the IAB Character Set Workshop held 29 February - 1 March, 1996".
"IETF Policy on Character Sets and Languages"
.
Довольно обширная подборка документов находится здесь : . См. также коллекцию
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 |
| и т.д. |
Или даже как в случае кодовой страницы
CP1251, когда в
Microsoft Internet Explorer или
IIS эта кодировка фигурирует как "
Windows-1251".
| Windows-1251 |
| Win-1251 |
| CP1251 |
| CP-1251 |
| и т.д. |
Дак вот, схема
name mangling по Drepper-у еще как-то работает для
ISOxxxx, но совершенно не работает для имен
Codepages CP-xxx/
IBM-xxx/
Windows-xxx. То есть, нужна поддержка
Alias:-ов по
IANA.
Вобщем, засада с этим
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 (в отличие от тех же ). А как было бы все тогда просто...
Содержание ""
Last change : 18-01-2000