默认区域设置"root"在 ICU 中如何工作?

How does the default locale "root" work in ICU?

本文关键字:何工作 工作 设置 区域 root ICU 默认      更新时间:2023-10-16

目前看到默认语言环境"root"在Linux和Windows中的行为方式存在差异。

使用 ICU v54.1

在Windows中,我们将Locale::getDefault()视为en_GB。
平台: 温道服务器 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");

决定使用 getDisplayName(Locale, UnicodeString name) 在默认值为"root"时返回特定于区域设置的显示名称

例如;

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

可能这对某人有帮助