CHARSET и его имя.

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

    А проблема состоит в следующем. С сожалением мы вынуждены признать, что в настоящее время не существует строгого стандарта на ИМЯ Charset-а.

    Даже для имен из стандарта ISO возможны варианты записи:

ISO8851-1
ISO-8859-1
ISO_8859-1
и т.д.

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

    Когда-то стандартизацией Charset-ов занималась организация IANA.

    Там, на 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.

     Самое полезное в этом документе то, что в нем определено понятие 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.

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

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

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

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

CP866
CP-866
IBM866
IBM_866
e.t.c.

    Или даже как в случае CP1251, когда в Microsoft Internet Explorer или IIS она объявлена как "Windows-1251". Дак вот, схема name mangling по Drepper-у еще как-то работает для ISOxxxx, но совершенно не работает для имен Codepages CPxxx/IBMxxx. Нужна поддержка Alias:-ов по IANA.

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

    Более того, в "чистом" POSIX вообще невозможно узнать имя Charset после setlocale(). Необходимо пользоваться не-POSIX функцией XPG (SVID, Unix98) : nl_langinfo(CODESET). Надо ли говорить, что некоторые UNIX (например FreeBSD) не имеют этих XPG-extensions и функции nl_langinfo() как таковой вообще. Что очень странно, поскольку в том же POSIX определена утилита locale c keyword-ом codeset которая "как-то" это имя определяет...

    Ситуация даже еще хуже, поскольку для полной поддержки Charset-ов необходимо держать несколько копий man-ов, info и message catlog-ов (NLS) в разных кодировках...

 

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

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


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


Last change : 28-05-1999


Banner.Novgorod.Ru