ISO 3166-1 alpha-2到国家名称转换.NET

时间:2012-08-08 10:32:53

标签: .net country-codes

我将处理一个提供符合ISO 3166-1 alpha-2标准的双字母国家代码的Feed。例如,英国的代码为GB。我的问题是,在提供“GB”作为某些.NET类或函数的输入时,是否有某种方法可以轻松取回“英国”?换句话说,这个翻译是由.NET提供的吗?

1 个答案:

答案 0 :(得分:1)

有点儿。 .NET使用“文化”,可以通过语言(使用ISO 639双字母标识符)和区域(使用ISO 3166)的组合进行唯一标识。因此,如果您同时了解语言和区域,则可以获得描述性名称:

var cultureInfo = new CultureInfo("en-gb");

var cultureName = cultureInfo.EnglishName; //"English (Great Britain)"

//your answer is now the text between the parentheses
var countryName = cultureName.Split('(',')')[1];

了解在这些文化中,地区是次要的语言;这个系统支持的每种语言都有一种文化,但不一定适用于使用该语言的每个国家。这意味着两件事;首先,你必须知道这种语言(因为,例如,瑞士和比利时有两种官方语言,德语和法语,印度和荷兰各有4种),其次,ISO代码可能不会存在于您期望的语言的文化列表中,如果语言和区域的组合使用的符号和符号足够接近另一个更为知名的文化而没有必要区分(例如,没有“en- CA“加拿大英语的文化,因为它与”en-US“相同;但是有一个”fr-CA“,因为加拿大的法语文化与大多数其他法语区域非常不同。)

其他解决方案不会内置,但不会非常困难;以制表符分隔或逗号分隔的格式查找或自己制作ISO代码和完整国家/地区名称的列表,并将文件粘贴到Dictionary<string, string>以便在固定时间内翻译:

var isoDict = new Dictionary<string, string>();

using(var stream = File.Open("isoCodes.csv"))
{
   using(var reader = new TextReader(stream))
   {
      string currentLine;
      do
      {
        currentLine = reader.ReadLine();
        if(currentLine == null) break;

        //assumes no headers, no format/data errors and 
        //a line format of "cc, Country Name\n";
        //ALWAYS "trust but verify" that the data is sane
        var parts = currentLine.Split(',');
        isoDict.Add(parts[0].Trim(), parts[1].Trim());
      } while(currentLine != null);
   } 
}