kernel: fix determination of using locale

Sergei Butakov butsergej at yandex.ru
Tue Apr 18 01:52:34 CDT 2006


On Tuesday 18 April 2006 09:39, Dmitry Timoshkov wrote:
> "Sergei Butakov" <butsergej at yandex.ru> wrote:
> > If set
> > # export LANG="POSIX"
> > # export LC_CTYPE="ru_RU.CP1251"
> > system_lcid (defined by LC_CTYPE) will be "ru_RU.CP1251";
> > user_lcid (defined by LANG) will be "en_US" - It's bug and it's visible
> > in programs for Windows.
>
> That's correct IMO, LANG takes the precedence over LC_TYPE. If you specify
> LANG="POSIX" you get what you asked for. AFAIK glibc does the same thing.

No.

From `man locale` (glibc-2.3.4):

LANG -
	Provide a DEFAULT value for the internationalization variables that are UNSET 
or NULL.
LC_ALL -
	IF SET to a non-empty string value, OVERRIDE the values of all the OTHER 
internationalization variables.
LC_CTYPE -
	Determine the locale for the interpretation of sequences of bytes of text 
data as  characters.

So any program must check variables in that order: LC_ALL, LC_CTYPE, LANG.
(First check LC_ALL. If LC_ALL defined then stop, if not defined then check 
LC_CTYPE. If LC_CTYPE defined then stop, if not defined then check LANG)

In Wine system_lcid defined by LC_ALL, LC_CTYPE, LANG. It's right.
user_lcid defined by LC_ALL, LANG only. It's wrong. LC_CTYPE must be checked 
too!



More information about the wine-devel mailing list