Чи існує перелік Java із відкритим кодом за кодами країн ISO 3166-1


83

Хтось знає про вільно доступний пакет Java 1.5, який містить перелік кодів країн ISO 3166-1 як перерахування чи EnumMap? Зокрема, мені потрібні "елементи коду ISO 3166-1-альфа-2", тобто двозначний код країни, такий як "us", "uk", "de" тощо. Створити його досить просто (хоч і нудно), але якщо вже є стандартний там, де є апаш-земля, або подібний, це заощадить трохи часу.


3
Зверніть увагу, що ISO 3166-1-alpha-2 для Великобританії - це Великобританія, а не Великобританія, як у Вашому запитанні.
Адріан Сміт,

1
@Ken так, ви можете, але тоді вам доведеться підтримувати цей список та підтримувати його синхронізацію з wikipedia. Проблема наростає ...
jontejj

Відповіді:


110

Тепер реалізація списку коду країни ( ISO 3166-1 alpha-2 / alpha-3 / numeric ) як Java enum доступна на GitHub під ліцензією Apache версії 2.0.

Приклад:

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-червня-09

Перелік CountryCode був упакований в com.neovisionaries.i18n з іншими переліченнями Java, 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

Javadoc

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

OSGi

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

Привіт Такахіко, дякую за це! Я щойно додав три зниклі країни, вибачте, я поспішав, і я просто роздвоїв репо, ви знайдете оновлення тут: github.com/bbossola/CountryCode
Бруно Боссола

Привіт Бруно! Дякуємо, що знайшли відсутні записи (AL, AN та GN). Я звернувся до вашого розгалуженого сховища та скопіював їх вручну до свого сховища. Дякую!
Такахіко Кавасакі

Дякую так багато для цієї бібліотеки.
Matt Ball

Якщо ви займаєтеся банківською діяльністю, існує бібліотека, що має ліцензію Apache-2, " iban4j " (простір імен org.iban4j), щоб обробляти коди IBAN та BIC, а також вона має перелік CountryCode
David Tonhofer

54

Цей код отримує 242 країни в Sun Java 6:

String[] countryCodes = Locale.getISOCountries();

Хоча веб-сайт ISO стверджує, що існує 249 елементів коду ISO 3166-1-alpha-2 , хоча javadoc посилається на ту саму інформацію.


7
Ця інформація є чітко кодованою. Вам потрібно регулярно оновлювати JRE, щоб постійно оновлювати :)
BalusC

У Java 7 є 247 країн, що все ще менше, ніж в офіційному стандарті (а це 249).
Джаггер

2
Зникли безвісти: ПІВДЕННИЙ СУДАН (СС) та СІНТ МАРТЕН (ГОЛЯНСЬКА ЧАСТИНА) (SX)
Джаггер

Java 1.6.0_33-b05включає 248, лише відсутні SSзараз. Це просто тому, що SSє останньою (2011 р.) Країною, яку потрібно додати, а джерело Java 6 не оновлено.
andyb

1
ОП запитує "вільно доступний пакет Java 1.5": як відповідь із запитом Java6 або Java7 застосовується до цього? Проголосовано проти.
Bruno Bossola

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

2
Це не перелік.
Девід

@David генерує тіло перерахування
Божо

1
Приємний код генерації, але вам потрібно видалити спеціальні символи. Наприклад, CÔTE_D'IVOIRE не може використовуватися як перерахування: P.
Jacob van Lingen

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

Це дасть вам список мов, а не країн.
Гердем


1

Якщо хтось уже використовує Amazon AWS SDK, він включає com.amazonaws.services.route53domains.model.CountryCode. Я знаю, що це не ідеально, але це альтернатива, якщо ви вже використовуєте AWS SDK. У більшості випадків я б використовував Такахіко, 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 - це просто копіювання та вставлення з таблиці Вікіпедії (просто видаліть усі зайві рядки, переконуючись, що у вас є код країни та назва країни на рядок).

Тоді просто помістіть це у свій статичний клас:

/**
 * 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

Я не знав про це запитання, поки зовсім недавно не відкрив свій перелік Java саме для цієї мети! Дивовижний збіг обставин!

Я розмістив цілий вихідний код у своєму блозі з ліцензією BSD caluse 3, тому не думаю, що хтось мав би про це яловичину.

Ви можете знайти тут. https://subversivebytes.wordpress.com/2013/10/07/java-iso-3166-java-enum/

Сподіваюся, це корисно і полегшує біль у розвитку.


0

Я створив перелік, до якого Ви звертаєтесь англійською назвою країни. Див. Country-util .
На кожному переліку ви можете зателефонувати, getLocale()щоб отримати Java Locale.

З локалі ви можете отримати всю інформацію, до якої звикли, застосовуючи двобуквенний код країни 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
  • Швидше за все простіші / менш виразні, ніж інші рішення, яких я не знаю.
  • Створений для власних потреб / не як такий підтримується. - Вам, мабуть, слід клонувати репо.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.