[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/