当前发现默认语言环境“ root”在Linux和Windows中的行为存在差异。
使用ICU v54.1
在Windows中,我们将Locale::getDefault()
视为en_GB。
平台:WINDOWS Server 2012 R2
在Linux中,我们将Locale::getDefault()
视为“根”。
平台:CentOS 7
strace -e file /usr/bin/locale
给予
execve("/usr/bin/locale", ["locale"], [/* 27 vars */]) = 0
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
LANG=en_GB.UTF-8
LC_CTYPE="en_GB"
LC_NUMERIC="en_GB"
LC_TIME="en_GB"
LC_COLLATE="en_GB"
LC_MONETARY="en_GB"
LC_MESSAGES="en_GB"
LC_PAPER="en_GB"
LC_NAME="en_GB"
LC_ADDRESS="en_GB"
LC_TELEPHONE="en_GB"
LC_MEASUREMENT="en_GB"
LC_IDENTIFICATION="en_GB"
LC_ALL=en_GB
目前还不确定如何映射“根”语言环境!谷歌搜索后,看到它可以被映射到en_US_POSIX-如何进行验证?
打印出NumberFormat::getAvailableLocales
的列表时,使用locale.getDisplayName(name)
时只会得到短名而不是全名
虽然可以正常工作,但是在指定Locale::setDefault(locid)
时,
这不理想!
也尝试使用export LC_ALL=C
,但这对ICU中的默认语言环境没有影响。
理想地,在代码中只需将语言环境设置为“ C”就足够了,并且不管理默认语言。
icu::Locale::Locale("C");
答案 0 :(得分:0)
决定在默认值为“ root”时使用getDisplayName(Locale, UnicodeString name)
返回特定于语言环境的显示名称
例如;
const icu::Locale fallbackDisplayNameLocale = icu::Locale("en_US");
UnicodeString name(icu_locale.getName());
std::string displayName;
if (strcmp(icu::Locale::getDefault().getLanguage(), "root") == 0)
{
icu_locale.getDisplayName(fallbackDisplayNameLocale, name).toUTF8String(displayName);
} else {
icu_locale.getDisplayName(name).toUTF8String(displayName);
}
可能对某人有帮助