[英]How does the default locale “root” work in ICU?
當前,在Linux和Windows中,默認語言環境“ root”的行為存在差異。
使用ICU v54.1
在Windows中,我們將Locale::getDefault()
視為en_GB。
平台:Windows Server 2012 R2
在Linux中,我們將Locale::getDefault()
視為“ root”。
平台: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");
當默認為“ root”時getDisplayName(Locale, UnicodeString name)
決定使用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);
}
可能對某人有幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.