[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

glibc locale



From: Ivan Pascal <pascal@info.tsu.ru>

>P.S. Александр. Я тебе отправлял письмо с просьбой о помощи.
>Ты его читал? Или как?
(>Я спрашивал - может ли команда locale и процедурка setlocale показывать
>разные значения? И если да, то - почему?)


 Ты имеешь в виду форму вызова setlocale(LC_XXX,NULL) ?

 Эта форма _теоретически_ всегда должна возвращать результат
предыдущей успешно завершившейся setlocale(LC_XXX,"Lname")
или "C" если setlocale в этом приложении еще не разу не вызывалась.

 Если используется форма setlocale(LC_XXX,"") -- то все зависит
от переменных окружения. Приоритет такой.
1) LC_ALL
2) LANG
3) конкретная категория : LC_CTYPE, LC_COLLATE, e.t.c.

 Другое дело, что надо не забывать проверить успешность
вызова setlocale(LC_XXX,"Locale"). В случае успешного
завершения функция возвращает указатель на свеже-
установленную строку "Lname", в случае неуспешного --
-- указатель на "С" или предыдущее значение.

 Есть тонкий момент, когда мы вызываем setlocale(LC_ALL,"")
а у нас нет файла-"объекта локализации" какой-то из категорий.
Тогда этот вызов вернет строку из LC_ALL или LANG, некоторые
категории установятся (для которых есть "объекты"), а некоторые
останутся прежними ("С").

 По крайней мере во FreeBSD libc именно так. Для glibc2 все
чуть сложнее, поскольку там есть locale.alias . Так что мы
можем запросить одно значение setlocale(LC_XXX,"Lname")
а через selocale(LC_XXX,NULL) получить совсем другое.
Что с эти делать -- я не знаю. POSIX на эту тему молчит.

 Вообще-то мы забрели в дебри POSIX... :-)

 Утилиты locale во FreeBSD нет до сих пор. Стандарта на формат
вывода этой утилиты тоже нет. Нам остается только исследовать
работу locale из glibc2 и смотреть ее исходники.

 Сейчас буду смотреть :-) Общее правило такое :
если значение конкретной категории унаследовалось от
LANG, оно заключается в кавычки. Если же есть конкретное
указание значения категории через переменную -- она
пишется без кавычек. Вот например вывод, когда
LANG не установлен, а стоит только LC_CTYPE :
[root@host ~]# locale
LANG=POSIX
LC_CTYPE=ru_RU.KOI8-R
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_ALL=
[root@host ~]#

 Тоже бред. С чего это вдруг LANG=POSIX ???

--
-=AV=-