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

82

Kennt jemand ein frei verfügbares Java 1.5-Paket, das eine Liste der ISO 3166-1-Ländercodes als Enum oder EnumMap enthält? Insbesondere benötige ich die "ISO 3166-1-alpha-2-Codeelemente", dh den 2-stelligen Ländercode wie "us", "uk", "de" usw. Das Erstellen eines Codes ist einfach genug (obwohl mühsam), aber wenn Es gibt bereits einen Standard im Apachenland oder ähnliches, der ein wenig Zeit sparen würde.

Jason Jenkins
quelle
3
Beachten Sie, dass ISO 3166-1-alpha-2 für Großbritannien GB und nicht Großbritannien ist, wie in Ihrer Frage.
Adrian Smith
1
@ Ken ja du kannst aber dann musst du diese Liste pflegen und sie mit Wikipedia synchron halten. Das Problem wächst ...
jontejj

Antworten:

109

Eine Implementierung der Ländercode - Liste ( ISO 3166-1 Alpha-2 / Alpha-3 / Numerisch ) 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

Die CountryCode-Aufzählung wurde in com.neovisionaries.i18n mit anderen Java-Aufzählungen, LanguageCode ( ISO 639-1 ), LanguageAlpha3Code ( ISO 639-2 ), LocaleCode, ScriptCode ( ISO 15924 ) und CurrencyCode ( ISO 4217 ) gepackt und in Maven Central registriert Repository.

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"
Takahiko Kawasaki
quelle
Hallo Takahiko, danke dafür! Ich habe gerade drei fehlende Länder hinzugefügt, sorry, ich hatte es eilig und ich habe gerade das Repo gegabelt. Die Updates finden Sie hier: github.com/bbossola/CountryCode
Bruno Bossola
Hallo Bruno! Vielen Dank, dass Sie die fehlenden Einträge (AL, AN und GN) gefunden haben. Ich habe auf Ihr gegabeltes Repository verwiesen und sie manuell in mein Repository kopiert. Danke dir!
Takahiko Kawasaki
Vielen Dank so viel für diese Bibliothek.
Matt Ball
Für den Fall, dass Sie Bankgeschäfte erledigen, gibt es eine Apache-2-lizenzierte Bibliothek namens " iban4j " (Namespace org.iban4j) für IBAN- und BIC-Codes sowie eine CountryCode-Aufzählung: CountryCode
David Tonhofer
53

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

String[] countryCodes = Locale.getISOCountries();

Obwohl die ISO-Website behauptet, dass es 249 ISO 3166-1-alpha-2-Codeelemente gibt , verweist der Javadoc auf dieselben Informationen.

McDowell
quelle
7
Diese Informationen sind fest codiert. Sie müssten JRE
regelmäßig
In Java 7 gibt es 247 Länder, immer noch weniger als im offiziellen Standard (249).
Jagger
2
Die fehlenden sind: SOUTH SUDAN (SS) und SINT MAARTEN (DUTCH PART) (SX)
Jagger
Java 1.6.0_33-b05enthält 248, nur SSjetzt verpasst . Dies liegt einfach daran, dass SSdas letzte (2011) Land hinzugefügt wurde und die Java 6-Quelle nicht aktualisiert wurde.
Andy
1
Das OP fragt nach "einem frei verfügbaren Java 1.5-Paket": Wie trifft eine Antwort, die Java6 oder Java7 anfordert, darauf zu? Abgestimmt.
Bruno Bossola
11

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);
    }
}
Bozho
quelle
fügte eine Zeile im Druck hinzu, um Intellitxt zu aktivieren
NimChimpsky
2
Das ist keine Aufzählung.
David
@ David es erzeugt den Körper einer Aufzählung
Bozho
1
Netter Generierungscode, aber Sie müssen die Sonderzeichen entfernen. Zum Beispiel kann CÔTE_D'IVOIRE nicht als Aufzählung verwendet werden: P.
Jacob van Lingen
9

Wenn Sie sich bereits auf das Java-Gebietsschema verlassen, empfehle ich die Verwendung einer einfachen HashMap, 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 aus dem Ländernamen abrufen. Sie können auch einen ISO-Code für die Ländernamenzuordnung festlegen. Ändern Sie einfach die Put-Methode entsprechend.

sskular
quelle
4

Es gibt eine einfache Möglichkeit, diese Aufzählung mit dem Sprachnamen zu generieren. Führen Sie diesen Code aus, um die Liste der einzufügenden Aufzählungsfelder zu generieren:

 /**
  * 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) + "\"),");
  }
 }
Christophe Desguez
quelle
Dies gibt Ihnen eine Liste von Sprachen, nicht von Ländern.
Gerdemb
1

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

Ben Dowling
quelle
1

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

abdielou
quelle
1

Das AWS Java SDK verfügt über CountryCode .

Noel Yap
quelle
0

Dies beantwortet die Frage immer noch nicht. Ich suchte auch nach einer Art Enumerator dafür und fand nichts. Einige Beispiele, die hier die 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

Dabei handelt es sich bei der Datei data.txt um 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 platzieren Sie dies einfach in Ihrer statischen Klasse:

/**
 * 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! ...
         //
}
bruno.braga
quelle
0

Ich wusste nichts über diese Frage, bis ich kürzlich meine Java-Enumeration für genau diesen Zweck als Open-Source-Lösung bereitgestellt hatte! Erstaunlicher Zufall!

Ich habe den gesamten Quellcode mit der BSD Caluse 3-Lizenz in mein Blog aufgenommen, damit ich nicht glaube, dass irgendjemand etwas davon haben würde.

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

Hoffe, es ist nützlich und lindert Entwicklungsprobleme.

george_h
quelle
0

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

Im Gebietsschema erhalten Sie alle Informationen, die Sie gewohnt sind, z. B. den aus zwei Buchstaben bestehenden Ländercode 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;
    }

Profi:

  • Leicht
  • Zuordnungen zu Java-Gebietsschemas
  • Adressierbar mit vollem 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 neu, um Änderungen an der Liste der in der Aufzählung aufgeführten Länder zu erhalten.

Con:

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