【问题标题】:ISO_3166-1 Country Names and java.util.LocaleISO_3166-1 国家名称和 java.util.Locale
【发布时间】:2019-01-10 04:05:12
【问题描述】:

我正在尝试将 ISO 分配的国家/地区名称转换为其 ISO_3166-1 alpha 3(3 个字母)代码。我已经在这里看到了代码 sn-ps。

但是,getDisplayCountry 方法返回的字符串与the ISO website 上显示的指定名称 似乎有所不同。例如,对于 Alpha 3 代码“RUS”,getDisplayCountry"Russia",而 ISO 分配的英文名称(又名英文简称)如下所示。

如何解决这个问题?特别是如果我不想维护一个单独的查找文件 - 这违背了使用内置 java 类的全部意义。

【问题讨论】:

  • 为什么使用网站名称如此重要? ISO 3166 的目的是定义国际公认的字母和/或数字代码,我们在提及国家和地区时可以使用这些代码。但是,它没有定义国家的名称。 iso.org/iso-3166-country-codes.html
  • 您必须创建自己的Locale。我的问题是,如果您的一位用户看到“俄罗斯”而不是“俄罗斯联邦”,那会是什么混乱?
  • 您好,感谢您抽出宝贵时间回复。传入的数据将包含基于 ISO 列表的国家名称 - 如网站所示。我指的代码不是面向用户的。它是入站接口的一部分。

标签: java iso


【解决方案1】:

Locale.getDisplayCountry() 以适合在用户所在区域显示的形式返回国家/地区名称:

返回适合向用户显示的区域设置国家/地区的名称。如果可能,返回的名称将针对默认的 DISPLAY 语言环境进行本地化。例如,如果语言环境是 fr_FR,默认的 DISPLAY 语言环境是 en_US,getDisplayCountry() 将返回“France”;如果语言环境是 en_US 并且默认的 DISPLAY 语言环境是 fr_FR,getDisplayCountry() 将返回“Etats-Unis”。如果返回的名称无法针对默认的 DISPLAY 语言环境进行本地化(例如,我们没有克罗地亚的日文名称),则此函数将使用英文名称,并使用 ISO 代码作为最后的值。如果语言环境未指定国家/地区,则此函数返回空字符串。

ISO 网站仅列出了英语和法语变体的国家/地区。看起来 Java 可能使用不同(或更改)的国家名称来源,因此即使您提到的 en_US 语言环境,这些名称也不能保证匹配。

如果您只需要匹配显示名称(并且您的显示名称在整个数据集中进行了标准化),您可以在列表之间创建映射。本质上,您将下载 ISO 列表并使用 2 位或 3 位国家代码创建一个由 ISO 显示名称到 Java 显示名称组成的查找表。从那里您可以映射您的数据。

【讨论】:

  • 感谢您的回复迈克。换句话说,您是说 ISO 网站上显示的值不一定是 Java 返回的值。因此,要么进行额外的查找,要么使用 java 显示值作为源字符串 :-( 我得出了相同的结论,只是确保我没有错过第三种选择。
  • 将俄罗斯而不是俄罗斯联邦作为 iso.org 值是第二个值,这真是一团糟。有什么理由不能获得官方的 ISO 国家名称吗? iso.org/obp/ui/#iso:code:3166:RUJava Locale 类的代码遵循 ISO 模式,但国家/地区名称不遵循……这没有任何意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多