[Homeros] Voiceman. Определение кодировки

Дмитрий Падучих dpaduch на k66.ru
Пн Май 10 09:25:51 UTC 2010


Michael Pozhidaev:

MP> Hello, Дмитрий Падучих!

[...]

>> $LC_CTYPE и $LC_ALL имеют приоритет перед $LANG. К тому же в имени
>> локали может не быть кодировки. Более надёжный (и простой) способ:

MP> Если там нет кодировки, то берём US_ASCII, как, например, делается в
MP> случаях запуска сервера от рута.

$ LC_ALL=russian date | enca
KOI8-R Cyrillic
  LF line terminators
$ grep russian /etc/locale.alias 
russian         ru_RU.KOI8-R
$ locale
LANG=ru_RU.UTF-8
....

>> setlocale(LC_CTYPE, "");

MP> Тогда уж LC_ALL, а не LC_CTYPE?

LC_ALL тоже подойдёт, но достаточно и LC_CTYPE.

[...]

>> специальная кодировка - wchar_t. Возможно, лучше использовать её.

MP> Как быть увереным, что wchar_t окажется utf32le или его алиасом?
MP> Даже если она будет utf32be, это, очевидно, сломает использование
MP> строковых констант в исходниках.

Как я понимаю, кодировка wchar_t - это как раз то, что используется для
представления типа wchar_t и строковых констант. Поэтому уверенность,
что кодировка wchar_t - это utf32le или его алиас, в общем-то не нужна.
Проблема в том, что местный iconv может и не понять, что такое wchar_t.

MP> Тут вопрос в том, что окажется вероятней, тип wchar_t будет иметь
MP> длину отличную от четырёх байт, или кодировка wchar_t окажется не
MP> utf32le.

Наибольшую надёжность мог бы дать тест при помощи memcmp после старта
программы. А вообще мне не раз приходилось слышать, что wchar_t -
отстой. Говорили, например, что в BSD представление wchar_t зависит от
текущей локали. Вот, например, критика wchar_t в документации
libunistring:

http://www.gnu.org/software/libunistring/manual/html_node/The-wchar_005ft-mess.html

Впрочем, думаю, что в Linux можно рассчитывать на UCS-4.

-- 
Дмитрий Падучих


Подробная информация о списке рассылки Homeros