是否有ISO 3166-1国家/地区代码的开放源Java枚举?


83

有谁知道免费提供的Java 1.5程序包,该程序包以枚举或EnumMap的形式提供ISO 3166-1国家/地区代码列表?具体来说,我需要“ ISO 3166-1-alpha-2代码元素”,即2个字符的国家/地区代码,例如“ us”,“ uk”,“ de”等。创建一个很简单(虽然很繁琐),但是如果在apache土地上已经有一个标准的模型了,这样可以节省一些时间。


3
请注意,英国的ISO 3166-1-alpha-2是GB,而不是您所质疑的英国。
阿德里安·史密斯

1
@Ken是的,您可以,但是然后您必须维护该列表并使其与Wikipedia保持同步。问题越来越大……
jontejj 2015年

Answers:


110

现在,可以在GitHub下以Apache许可证2.0版获得国家代码(ISO 3166-1 alpha-2 / alpha-3 /数字)列表的Java枚举实现。

例:

CountryCode cc = CountryCode.getByCode("JP");

System.out.println("Country name = " + cc.getName());                // "Japan"
System.out.println("ISO 3166-1 alpha-2 code = " + cc.getAlpha2());   // "JP"
System.out.println("ISO 3166-1 alpha-3 code = " + cc.getAlpha3());   // "JPN"
System.out.println("ISO 3166-1 numeric code = " + cc.getNumeric());  // 392

最后编辑2016年6月9日

CountryCode枚举与其他Java枚举一起打包到com.neovisionaries.i18n中,LanguageCode(ISO 639-1),LanguageAlpha3Code(ISO 639-2),LocaleCode,ScriptCode(ISO 15924)和CurrencyCode(ISO 4217),并注册到Maven Central中仓库。

马文

<dependency>
  <groupId>com.neovisionaries</groupId>
  <artifactId>nv-i18n</artifactId>
  <version>1.22</version>
</dependency>

摇篮

dependencies {
  compile 'com.neovisionaries:nv-i18n:1.22'
}

的GitHub

https://github.com/TakahikoKawasaki/nv-i18n

Java文档

http://takahikokawasaki.github.com/nv-i18n/

OSGi

Bundle-SymbolicName: com.neovisionaries.i18n
Export-Package: com.neovisionaries.i18n;version="1.22.0"

嗨,高彦彦对此表示感谢!我刚刚添加了三个缺失的国家/地区,对不起,我很着急,我刚提交了仓库
Bruno Bossola 2012年

嗨,布鲁诺!感谢您找到缺少的条目(AL,AN和GN)。我提到了您的分叉存储库,然后将它们手动复制到了我的存储库中。谢谢!
川崎隆彦

谢谢你这么多了这个库。
马特·鲍尔

如果你正在做的东西的银行,有一个名为“一个Apache 2许可库iban4j ”空间(namespace org.iban4j)来处理IBAN和BIC代码,它也有一个COUNTRYCODE枚举:COUNTRYCODE
大卫Tonhofer

54

此代码在Sun Java 6中获得242个国家/地区的代码:

String[] countryCodes = Locale.getISOCountries();

尽管ISO网站声称有249个ISO 3166-1-alpha-2代码元素,但是javadoc链接到相同的信息。


7
此信息是硬编码的。您需要定期更新JRE以保持更新:)
BalusC 2010年

在Java 7中,有247个国家/地区,仍然比官方标准(249个国家/地区)少。
贾格尔2012年

2
失踪的是:南苏丹(SS)和圣马丁(荷兰部分)(SX)
Jagger

Java 1.6.0_33-b05包括248,只是SS现在不见了。这是因为这是SS要添加的最新国家(2011年),并且Java 6来源尚未更新。
andyb 2013年

1
OP要求“免费提供的Java 1.5程序包”:请求Java6或Java7的答案如何应用?不赞成投票。
Bruno Bossola 2014年

11

这是我使用国家代码+国家名称生成枚举的方法:

package countryenum;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;

public class CountryEnumGenerator {
    public static void main(String[] args) {
        String[] countryCodes = Locale.getISOCountries();
        List<Country> list = new ArrayList<Country>(countryCodes.length);

        for (String cc : countryCodes) {
            list.add(new Country(cc.toUpperCase(), new Locale("", cc).getDisplayCountry()));
        }

        Collections.sort(list);

        for (Country c : list) {
            System.out.println("/**" + c.getName() + "*/");
            System.out.println(c.getCode() + "(\"" + c.getName() + "\"),");
        }

    }
}

class Country implements Comparable<Country> {
    private String code;
    private String name;

    public Country(String code, String name) {
        super();
        this.code = code;
        this.name = name;
    }

    public String getCode() {
        return code;
    }


    public void setCode(String code) {
        this.code = code;
    }


    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }


    @Override
    public int compareTo(Country o) {
        return this.name.compareTo(o.name);
    }
}

在打印中添加了一行以启用intellitxt
NimChimpsky 2011年

2
那不是一个枚举。
大卫

@David生成枚举的主体
Bozho 2015年

1
不错的生成代码,但是您需要删除特殊字符。例如,CÔTE_D'IVOIRE不能用作枚举:P。
雅各布·范·林根

9

如果您已经要依赖Java语言环境,那么我建议您使用简单的HashMap而不是为国家/地区创建新类等。

如果仅依赖Java本地化,则将使用以下方法:

private HashMap<String, String> countries = new HashMap<String, String>();
String[] countryCodes = Locale.getISOCountries();

for (String cc : countryCodes) {
    // country name , country code map
    countries.put(new Locale("", cc).getDisplayCountry(), cc.toUpperCase());
}

填写地图后,您可以随时根据需要从国家/地区名称获取ISO代码。或者您也可以将其设置为ISO代码到国家/地区名称映射,只需相应地修改“ put”方法即可。


4

有一种简单的方法可以使用语言名称生成该枚举。执行以下代码以生成要粘贴的枚举字段列表:

 /**
  * This is the code used to generate the enum content
  */
 public static void main(String[] args) {
  String[] codes = java.util.Locale.getISOLanguages();
  for (String isoCode: codes) {
   Locale locale = new Locale(isoCode);
   System.out.println(isoCode.toUpperCase() + "(\"" + locale.getDisplayLanguage(locale) + "\"),");
  }
 }

这会为您提供语言列表,而不是国家/地区。
gerdemb


1

如果任何人已经在使用Amazon AWS开发工具包,则将包括com.amazonaws.services.route53domains.model.CountryCode。我知道这不是理想的选择,但是如果您已经使用过AWS开发工具包,则可以选择。在大多数情况下,我会使用Takahiko的,nv-i18n因为正如他提到的那样,它实现了ISO 3166-1。



0

这仍然没有回答问题。我也在为此寻找一种枚举器,但没有找到任何东西。这里使用哈希表的一些示例,但与内置的get表示相同

我会选择不同的方法。因此,我在python中创建了一个脚本来自动生成Java中的列表:

#!/usr/bin/python
f = open("data.txt", 'r')
data = []
cc = {}

for l in f:
    t = l.split('\t')
    cc = { 'code': str(t[0]).strip(), 
           'name': str(t[1]).strip()
    }
    data.append(cc)
f.close()

for c in data:
    print """
/**
 * Defines the <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">ISO_3166-1_alpha-2</a> 
 * for <b><i>%(name)s</i></b>.
 * <p>
 * This constant holds the value of <b>{@value}</b>.
 *
 * @since 1.0
 *
 */
 public static final String %(code)s = \"%(code)s\";""" % c

其中data.txt文件是从Wikipedia表进行的简单复制和粘贴(只需删除所有多余的行,确保每行都有一个国家/地区代码和国家/地区名称)。

然后将其放入您的静态类中:

/**
 * Holds <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">ISO_3166-1_alpha-2</a>
 * constant values for all countries. 
 * 
 * @since 1.0
 * 
 * </p>
 */
public class CountryCode {

    /**
     * Constructor defined as <code>private</code> purposefully to ensure this 
     * class is only used to access its static properties and/or methods.  
     */
    private CountryCode() { }

    /**
     * Defines the <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">ISO_3166-1_alpha-2</a> 
     * for <b><i>Andorra</i></b>.
     * <p>
     * This constant holds the value of <b>{@value}</b>.
     *
     * @since 1.0
     *
     */
     public static final String AD = "AD";

         //
         // and the list goes on! ...
         //
}


0

我已经创建了一个枚举,您可以用英语的国家名称来称呼。参见country-util
在每个枚举上,您可以调用getLocale()以获取Java语言环境。

您可以从“语言环境”中获取习惯使用的所有信息,并输入ISO-3166-1两个字母的国家/地区代码。

public enum Country{

    ANDORRA(new Locale("AD")),
    AFGHANISTAN(new Locale("AF")),
    ANTIGUA_AND_BARBUDA(new Locale("AG")),
    ANGUILLA(new Locale("AI")),
    //etc
    ZAMBIA(new Locale("ZM")),
    ZIMBABWE(new Locale("ZW"));

    private Locale locale;

    private Country(Locale locale){
        this.locale = locale;
    }

    public Locale getLocale(){
        return locale;
    }

优点:

  • 重量轻
  • 映射到Java语言环境
  • 可通过全名查询
  • 枚举值不是硬编码的,而是通过调用Locale.getISOCountries()生成的。也就是说:只需针对最新的Java版本重新编译该项目,即可对枚举中反映的国家/地区列表进行任何更改。

缺点:

  • 不在Maven存储库中
  • 我最不知道的是,它可能比其他解决方案更简单/表达更少。
  • 根据我自己的需要创建/未维护。-您可能应该克隆存储库。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.