unicode: check $LC_CTYPE too to detect Unicode mode

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2013-07-05 22:00:57 +02:00
parent 4f9fc1e5f5
commit 2301d127a2
4 changed files with 13 additions and 2 deletions

View File

@ -161,12 +161,13 @@ config UNICODE_USING_LOCALE
Internal implementation is smaller. Internal implementation is smaller.
config FEATURE_CHECK_UNICODE_IN_ENV config FEATURE_CHECK_UNICODE_IN_ENV
bool "Check $LANG environment variable" bool "Check $LC_ALL, $LC_CTYPE and $LANG environment variables"
default n default n
depends on UNICODE_SUPPORT && !UNICODE_USING_LOCALE depends on UNICODE_SUPPORT && !UNICODE_USING_LOCALE
help help
With this option on, Unicode support is activated With this option on, Unicode support is activated
only if LANG variable has the value of the form "xxxx.utf8" only if locale-related variables have the value of the form
"xxxx.utf8"
Otherwise, Unicode support will be always enabled and active. Otherwise, Unicode support will be always enabled and active.

View File

@ -39,8 +39,15 @@ void FAST_FUNC reinit_unicode(const char *LANG)
void FAST_FUNC init_unicode(void) void FAST_FUNC init_unicode(void)
{ {
/* Some people set only $LC_CTYPE, not $LC_ALL, because they want
* only Unicode to be activated on their system, not the whole
* shebang of wrong decimal points, strange date formats and so on.
*
* TODO? Maybe we should use LC_CTYPE instead of LC_ALL in setlocale()?
*/
if (unicode_status == UNICODE_UNKNOWN) { if (unicode_status == UNICODE_UNKNOWN) {
char *s = getenv("LC_ALL"); char *s = getenv("LC_ALL");
if (!s) s = getenv("LC_CTYPE");
if (!s) s = getenv("LANG"); if (!s) s = getenv("LANG");
reinit_unicode(s); reinit_unicode(s);
} }
@ -63,6 +70,7 @@ void FAST_FUNC init_unicode(void)
{ {
if (unicode_status == UNICODE_UNKNOWN) { if (unicode_status == UNICODE_UNKNOWN) {
char *s = getenv("LC_ALL"); char *s = getenv("LC_ALL");
if (!s) s = getenv("LC_CTYPE");
if (!s) s = getenv("LANG"); if (!s) s = getenv("LANG");
reinit_unicode(s); reinit_unicode(s);
} }

View File

@ -9659,6 +9659,7 @@ preadfd(void)
*/ */
{ {
const char *s = lookupvar("LC_ALL"); const char *s = lookupvar("LC_ALL");
if (!s) s = lookupvar("LC_CTYPE");
if (!s) s = lookupvar("LANG"); if (!s) s = lookupvar("LANG");
reinit_unicode(s); reinit_unicode(s);
} }

View File

@ -2045,6 +2045,7 @@ static void get_user_input(struct in_str *i)
* shell was started. Therefore, re-check LANG every time: * shell was started. Therefore, re-check LANG every time:
*/ */
const char *s = get_local_var_value("LC_ALL"); const char *s = get_local_var_value("LC_ALL");
if (!s) s = get_local_var_value("LC_CTYPE");
if (!s) s = get_local_var_value("LANG"); if (!s) s = get_local_var_value("LANG");
reinit_unicode(s); reinit_unicode(s);