[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