【问题标题】:Culture specific string equality (danish)特定于文化的字符串相等(丹麦语)
【发布时间】:2013-12-10 15:27:31
【问题描述】:

在丹麦语中,双字母“aa”对应单字母“å”,这实际上意味着 Århus 和 Ålborg 等城市可以拼写为 Aarhus 和 Aalborg。由于“å”是字母表的最后一个字母,这意味着当使用 String.Compare 或对列表进行排序时,这些单词排在最后,这很好用 - 正如这里的几个用户所发现的那样。

不过好像不知道这两者其实是一样的,因为string.Equals、string.Compare和StringComparer都返回false:

Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.CreateSpecificCulture("da-DK");
Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("da-DK");

string str1 = "Aalborg";
string str2 = "Ålborg";

StringComparer.Create(CultureInfo.CreateSpecificCulture("da-DK"), true).Equals(str1, str2); // False
string.Equals(str1, str2, StringComparison.CurrentCultureIgnoreCase); // False
string.Compare(str1, str2, StringComparison.CurrentCultureIgnoreCase); // 1

那么如何在不同的语言环境中测试字符串相等性呢?

【问题讨论】:

  • 您的问题是,例如,我们如何将土耳其语字符串与丹麦语字符串进行比较?
  • 您似乎期望字符串比较会神奇地应用一些特定于语言的约定特定的规则。好吧,事实并非如此。字符串“å”和“aa”是不同的,就像“ae”和“ä”和“æ”都是不同的,尽管有些约定允许在人们使用“ae”时将“ä”和“æ”替换为“ae”不知道如何产生正确的字符。这根本不是字符级别的问题,如果你想考虑这样的回退/传统替换,你需要单独编码。
  • 确实我做到了,但那是“神奇”吗?也许只有我一个人,但我认为您可以正确地对字符串进行排序但不比较它们是不完全合乎逻辑的。但我想设计和维护它可能会花费太多的工作 - 不幸的是 - 因为在比较不同语言的地址时,您实际上需要了解所有这些特定于语言的约定,并自己编码 - 正如 maccrobbsen 所建议的那样。跨度>

标签: c# localization string-comparison


【解决方案1】:

我建议你编写自己的相等比较器,例如。 g.

public class MyDanishStringComparer : IEqualityComparer<string>
{
  public bool Equals(string x, string y)
  {
    return x.Replace("Å", "Aa").Equals(y.Replace("Å", "Aa"));
  }
}

可以这样调用:

public class MyTest
{
  string s1 = "Ålborg";
  string s2 = "Aalborg";
  MyDanishStringComparer comparer = new MyDanishStringComparer();

  comparer.Equals(s1, s2);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多