java.util.Locale中有一个空的第一个项目(java.util.Locale has a

2019-07-17 16:57发布

我试图让所有的地区从JVM来填充国家下拉。 第一项是一个空不空对象。 这是因为我使用一个TreeMap集合添加国家缩写和(可显示)名称不为空。 看看下面来看看收集是什么。

{=, AE=United Arab Emirates, AL=Albania, AR=Argentina, AT=Austria, AU=Australia, BA=Bosnia and Herzegovina, BE=Belgium, BG=Bulgaria, BH=Bahrain, BO=Bolivia, BR=Brazil,....

下面的代码。 我删除空对象,以确保第一个值是不是空的。

public Map<String, String> countries(Locale currentLocale) {
    Map<String, String> countries = new TreeMap<String, String>();
    for (Locale locale : Locale.getAvailableLocales()) {
        countries.put(locale.getCountry(),
                locale.getDisplayCountry(currentLocale));
    }
    countries.remove("");
    return countries;
}

JVM版本 - (建1.7.0_09-B05)

Answer 1:

该javadocs中基本涵盖这一点。

对于locale.getCountry()你会发现:

返回此语言环境,这要么是空字符串 ,大写的ISO 3166两字母代码,或UN M.49 3位数代码的国家/地区代码。

而对于locale.getDisplayCountry()你会发现:

返回的语言环境的国家名适合显示给用户。 如果可能的话,返回的名称将被本地化为默认语言环境。 例如,如果语言环境是fr_FR并且默认的语言环境是en_US,getDisplayCountry()将返回“法国”; 如果语言环境是en_US并且默认的语言环境是fr_FR,getDisplayCountry()将返回“Etats-紫光”。 如果返回的名称不能本地化默认语言环境(比方说,我们没有对克罗地亚的日本名称),则该功能将依赖英文名,并使用ISO代码作为最终的值。 如果该语言环境未指定国家,这个函数返回一个空字符串。

你不能“看到”一个不具有ISO代码,并回落至因为它不能本地化的语言环境,没有一个英文名称是(或者,没有一个国家指定)。 这是完全有效的,你与两个空字符串(虽然没什么用)清盘。



Answer 2:

有问题的区域比其他没有Locale.ROOT 。 locale == Locale.ROOT我的结束,我认为同样会为你真实的。

为什么Locale.ROOT存在? 据http://www.oracle.com/technetwork/java/javase/java8locales-2095355.html :

默认的“JRE”区域供应商的资源,为Locale.ROOT语言环境,如果没有指定的语言环境提供者支持请求的语言环境中使用。 例如,如果只有“CLDR”中规定的“java.locale.providers”系统属性,校书郎,工作起来就像要求为根语言环境,因为“CLDR”区域供应商不提供分页器语言环境数据。 指定“CLDR,JRE”补充“JRE”区域供应商的校书郎功能,以及更喜欢“CLDR”区域供应商的其他地区数据为“JRE”的人。



Answer 3:

尝试

    for (Locale locale : Locale.getAvailableLocales()) {
        System.out.println(locale.getLanguage() + " " + locale.getCountry());
    }

你会看到,某些地区只有语言没有任何一个国家

ms MY
ar QA
is IS
fi FI
pl 
en MT
...


文章来源: java.util.Locale has an empty first item
标签: java jvm locale