webentwicklung-frage-antwort-db.com.de

Gibt es eine Open-Source-Java-Enumeration der Ländercodes nach ISO 3166-1?

Kennt jemand ein frei verfügbares Java 1.5-Paket, das eine Liste der Ländercodes nach ISO 3166-1 als Enumment oder EnumMap enthält? Speziell brauche ich die "ISO 3166-1-alpha-2-Codeelemente", dh den 2-stelligen Ländercode wie "us", "uk", "de" usw. Erstellen eines ist einfach genug (obwohl langwierig), aber wenn Es gibt bereits einen Standard im Apache-Land oder ähnliches, das würde etwas Zeit sparen.

70
Jason Jenkins

Eine Implementierung der Ländercode-Liste ( ISO 3166-1alpha-2 / alpha-3 / numeric ) als Java-Enumeration ist jetzt bei GitHub unter Apache License Version 2.0 verfügbar .

Beispiel:

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

Letzte Änderung 2016-Jun-09

Das CountryCode-Enum wurde in com.neovisionaries.i18n zusammen mit anderen Java-Enummen gepackt. LanguageCode ( ISO 639-1 ), LanguageAlpha3Code ( ISO 639-2 ), LocaleCode, ScriptCode ( ISO 15924 ) und CurrencyCode ( ISO 4217 ) und im Maven Central Repository registriert.

Maven

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

Gradle

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

GitHub

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

Javadoc

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

OSGi

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

Dieser Code erhält 242 Länder in Sun Java 6:

String[] countryCodes = Locale.getISOCountries();

Obwohl die ISO-Website behauptet, gibt es 249 ISO 3166-1-alpha-2-Codeelemente, obwohl die javadoc - Links zu denselben Informationen führen.

44
McDowell

Wenn Sie sich bereits auf Java-Ländereinstellungen verlassen, empfiehlt es sich, eine einfache HashMap zu verwenden, anstatt neue Klassen für Länder usw. zu erstellen.

So würde ich es verwenden, wenn ich mich nur auf die Java-Lokalisierung verlassen würde:

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

Nachdem Sie die Karte ausgefüllt haben, können Sie den ISO-Code jederzeit von dem Ländernamen abrufen, den Sie benötigen ..__ Sie können auch einen ISO-Code für die Landnamenskarte erstellen.

9
sskular

So habe ich eine Aufzählung mit Ländercode + Ländername erstellt:

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

Es gibt eine einfache Möglichkeit, dieses Enum mit dem Sprachnamen zu generieren. Führen Sie diesen Code aus, um die Liste der Enum-Felder zum Einfügen zu erzeugen:

 /**
  * 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) + "\"),");
  }
 }
3

Wenn das Amazon AWS SDK bereits verwendet wird, enthält es com.amazonaws.services.route53domains.model.CountryCode. Ich weiß, dass dies nicht ideal ist, aber es ist eine Alternative, wenn Sie bereits das AWS SDK verwenden. In den meisten Fällen würde ich Takahikos nv-i18n verwenden, da er, wie er erwähnt, ISO 3166-1 implementiert.

1
abdielou

Keine Java-Enumeration, aber eine JSON-Version davon ist unter http://country.io/names.json verfügbar.

1
Ben Dowling

Ich habe eine Aufzählung erstellt, die Sie mit dem englischen Ländernamen ansprechen. Siehe country-util .
In jeder Aufzählung können Sie getLocale() aufrufen, um das Java-Gebietsschema zu erhalten. 

Über das Gebietsschema erhalten Sie alle Informationen, die Sie gewohnt sind, z. B. den aus zwei Buchstaben bestehenden ISO-3166-1-Ländercode.

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

Profi: 

  • Leicht
  • Karten für Java-Sprachumgebungen
  • Adressierbar durch vollständigen Ländernamen 
  • Aufzählungswerte werden nicht fest codiert, sondern durch einen Aufruf von Locale.getISOCountries () generiert. Das heißt: Kompilieren Sie das Projekt einfach mit der neuesten Java-Version, um Änderungen an der Liste der Länder zu erhalten, die in der Aufzählung enthalten sind.

Con: 

  • Nicht im Maven-Repository
  • Wahrscheinlich einfacher/weniger ausdrucksstark als die anderen Lösungen, die ich nicht kenne.
  • Für meine eigenen Bedürfnisse erstellt/nicht als solche gepflegt. - Sie sollten wahrscheinlich das Repo klonen.
0
Hervian

Ich wusste nichts über diese Frage, bis ich kürzlich mein Java-Enum für genau diesen Zweck geöffnet hatte! Erstaunlicher Zufall!

Ich habe den gesamten Quellcode in meinem Blog mit der BSD-Lizenz caluse 3 veröffentlicht. Ich glaube nicht, dass irgendjemand Rindfleisch darüber hätte.

Kann hier gefunden werden . https://subversivebytes.wordpress.com/2013/10/07/Java-iso-3166-Java-enum/

Hoffe, es ist nützlich und lindert Entwicklungsschmerzen.

0
george_h

Dies beantwortet die Frage immer noch nicht. Ich habe auch nach einer Art Enumerator gesucht und nichts gefunden. Einige Beispiele, die hier eine Hashtabelle verwenden, entsprechen jedoch dem integrierten get

Ich würde einen anderen Ansatz wählen. Also habe ich ein Skript in Python erstellt, um die Liste automatisch in Java zu generieren:

#!/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

die Datei data.txt ist ein einfaches Kopieren und Einfügen aus der Wikipedia-Tabelle (entfernen Sie einfach alle zusätzlichen Zeilen und stellen Sie sicher, dass Sie einen Ländercode und einen Ländernamen pro Zeile haben).

Dann fügen Sie dies einfach in Ihre statische Klasse ein:

/**
 * 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
bruno.braga