默认语言环境“ root”在ICU中如何工作?

时间:2019-04-30 08:36:47

标签: c++ c linux icu

当前发现默认语言环境“ 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");

1 个答案:

答案 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);
    }

可能对某人有帮助