Branch
Hash :
40b7c218
Author :
Date :
2025-03-22T13:03:43
setlocale-messages: Rename to setlocale-fixes and add Android support. * lib/setlocale-fixes.h: Renamed from lib/setlocale-messages.h. (setlocale_fixed, setlocale_fixed_null): New declarations. * lib/setlocale-fixes.c: Renamed from lib/setlocale-messages.h. (lc_cat_name): New variable. (cat_to_index, index_to_cat): New macro. (lc_all_name): New variable. (cat_names): New constant. (fill_lc_all_name, extract_single_name, setlocale_fixed, setlocale_fixed_null): New functions. * m4/setlocale.m4 (gl_FUNC_SETLOCALE): Set NEED_SETLOCALE_IMPROVED to 1 on Android. * lib/setlocale.c: Include setlocale-fixes.h instead of setlocale-messages.h. (setlocale_unixlike) [__ANDROID__]: Use setlocale_fixed instead of setlocale_mtsafe. (setlocale_improved): On Android, use setlocale_fixed_null instead of setlocale. * lib/getlocalename_l-unsafe.c: Include setlocale-fixes.h instead of setlocale-messages.h. (getlocalename_l_unsafe): On Android, use setlocale_fixed_null instead of setlocale_null. * modules/setlocale-fixes: Renamed from modules/setlocale-messages. (Files): Update. (configure.ac): Compile the .c file also on Android. (Include): Include setlocale-fixes.h instead of setlocale-messages.h. * modules/setlocale (Depends-on): Add setlocale-fixes. Remove setlocale-messages. * modules/getlocalename_l-unsafe (Depends-on): Likewise. * doc/posix-functions/setlocale.texi: Mention the Android problem.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
@node setlocale
@subsection @code{setlocale}
@findex setlocale
POSIX specification:@* @url{https://pubs.opengroup.org/onlinepubs/9799919799/functions/setlocale.html}
Gnulib module: setlocale, setlocale-null
@mindex setlocale
@mindex setlocale-null
Portability problems fixed by Gnulib module @code{setlocale}:
@itemize
@item
On Windows platforms (excluding Cygwin), @code{setlocale(@var{category},"")}
and @code{setlocale(@var{category},NULL)} both ignore the environment variables
@code{LC_ALL}, @code{@var{category}}, and @code{LANG}.
@item
On Windows platforms (excluding Cygwin) and Cygwin 1.5.x,
@code{setlocale(LC_ALL,@var{name})} succeeds and sets the LC_CTYPE category to
@samp{C} when it does not support the encoding, instead of failing.
@item
On Windows platforms (excluding Cygwin), @code{setlocale} understands different
locale names, that are not based on ISO 639 language names and ISO 3166 country
names.
@item
On Android 5.0 and newer, setting any category other than @code{LC_CTYPE} of
the global locale affects the @code{LC_CTYPE} category as well.
@item
On Android < 5.0, which doesn't have locales, the @code{setlocale} function
always fails. The replacement, however, supports only the locale names
@code{"C"} and @code{"POSIX"}.
@end itemize
Portability problems fixed by Gnulib module @code{setlocale} or @code{setlocale-null}:
@itemize
@item
Invocations of @code{setlocale (..., NULL)} are not multithread-safe on some
platforms:
musl libc, macOS, FreeBSD, NetBSD, OpenBSD, AIX, Haiku, Cygwin.
To make these invocations multithread-safe, you need the Gnulib module
@code{setlocale}, or you need to change the code to invoke @code{setlocale_null}
or @code{setlocale_null_r} instead.
@end itemize
Portability problems not fixed by Gnulib:
@itemize
@item
On Cygwin 1.5.x, which doesn't have locales,
@code{setlocale(LC_ALL,NULL)} always returns @code{"C"}.
@item
On Cygwin 1.7.0, only the charset portion of a locale designation is honored.
@item
On OpenBSD, @code{setlocale(LC_ALL,"")} will only update categories that
are deemed appropriate for the @code{LC_ALL} environment value, even if
there are other categories set to different values in the environment.
In addition any value is accepted for @code{LC_CTYPE}, and so NULL
is never returned to indicate a failure to set locale.
To verify category values, each category must be set individually
with @code{setlocale(LC_COLLATE,"")} etc.
@item
On Android 5.0 and newer, the default locale (i.e.@: the locale in use when
@code{setlocale} was not called) is the @code{"C.UTF-8"} locale, not the
@code{"C"} locale. Additionally, a @code{setlocale} call that is meant to set
the @code{"C"} or @code{"POSIX"} locale actually sets an equivalent of the
@code{"C.UTF-8"} locale.
@end itemize
Note: The names of locales with UTF-8 encoding are platform dependent:
@itemize
@item
On most platforms, they follow the naming scheme @samp{@var{ll}_@var{CC}.UTF-8}.
Here @samp{@var{ll}} is an @w{ISO 639} two-letter language code,
and @samp{@var{CC}} is an @w{ISO 3166} two-letter country code.
For example, @samp{en_US.UTF-8} (this locale exists on nearly all systems),
@samp{fr_FR.UTF-8}, and similar.
@item
On native Windows with mingw, UTF-8 locales are not supported.
@item
On native Windows with MSVC (version 14 or newer,
and with the @code{-MD} option in @code{CFLAGS}),
they follow the naming scheme @samp{@var{language}_@var{country}.65001}
or, equivalently, @samp{@var{language}_@var{country}.utf8},
where @samp{@var{language}} is a language name in English
and @samp{@var{country}} is a country name in English.
For example @samp{English_United States.65001} (yes, with a space in it!)
or @samp{French_France.65001}.
@end itemize