2

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

4

1 回答 1

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 代码和完整国家/地区名称的列表,然后将文件 slurp 成 aDictionary<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);
   } 
}
于 2012-08-08T15:35:07.110 回答