[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Linux internationalization page
> А про симлинки и алиасы он просто не знает.
Кстати, я тут буквально вчера нарыл весьма тонкий
момент в POSIX и locale... Если строго следовать POSIX,
то ЛЮБЫЕ Aliases нарушают стандарт.
Дело в том, что setlocale(3) определена так :
char * setlocale(int category, const char *locale)
То есть, функция ВОЗВРАЩАЕТ указатель на string.
Теперь предположим, что у нас работает Alias
ru_RU.KOI8-R ---> ru_SU
================
##include <stdio.h>
#include <locale.h>
#include <string.h>
main () {
char * reqlcname="ru_RU.KOI8-R";
char * gotlcname;
printf("We req = %s\n",reqlcname);
gotlcname=setlocale(LC_CTYPE, reqlcname);
printf("We got = %s\n",gotlcname);
if ( strcmp(gotlcname, reqlcname))
printf("We can't set REQUIRED locale !\n");
else
printf("Great! All OK.\n");
}
=========
То есть, если имя locale пропушено через locale.alias или
даже через symlink, у нас есть полное право считать что
setlocale() не сработала. Других способов определить,
сработала ли установка locale *просто нет*, потому что, если мы
запросим действительно НЕСУЩЕСТВУЮЩУЮ locale :
setlocale(LC_CTYPE, "un_KNOWN.Locale");
мы по стандарту POSIX должны получить указатель на "C" !
(Представляю, как кисло будет Ulrich-у Drepper-у ;-)
Отсюда вытекает правило : если вы хотите точно следовать
POSIX, используйте ПОЛНОЕ длинное имя locale :
language_TERRITORY.Codeset и сделайте чтобы данный
"объект локализации" РЕАЛЬНО существовал.
--
-=AV=-