[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.
> (код навскидку)
>
> ================
> #include <stdio.h>
> #include <locale.h>
> #include <string.h>
>
> main () {
> char * reqlcname="ru_RU.KOI8-R";
> char * gotlcname;
>
> gotlcname=setlocale(LC_CTYPE, reqlcname);
>
> if ( ! strcmp(gotlcname, reqlcname))
> printf("We can't set REQUIRED locale !\n");
> }
> =========
>
> То есть, если имя locale пропушено через locale.alias или
> даже через symlink, у нас есть полное право считать что
> setlocale() не сработала. Других способов определить,
> установилась ли locale *просто нет*, потому что, если мы
> запросим действительно НЕСУЩЕСТВУЮЩУЮ locale :
>
> setlocale(LC_CTYPE, "un_KNOWN.Locale");
>
> мы по стандарту POSIX должны получить указатель на "C" !
Из man setlocale:
If a pointer to a string is given for locale, setlocale attempts to set
the locale for the given category to locale. If setlocale succeeds,
locale is returned. If setlocale fails, a null pointer is returned and
the program's locale is not changed.
--
С наилучшими пожеланиями, Евгений Бырганов.
Best regards, Eugene Byrganov.
mailto:E.B.Byrganov@inp.nsk.su
work - http://www.inp.nsk.su/