【问题标题】:Difference between String.Compare and CultureInfo's CompareInfoString.Compare 和 CultureInfo 的 CompareInfo 的区别
【发布时间】:2011-11-05 12:17:40
【问题描述】:

我正在一个小型桌面应用程序中尝试使用 System.Gloablization。我对CultureInfo.Compare() 提供的额外控制比使用String.Compare() 方法及其重载感到有点困惑。

假设我有两个字符串

String s1 = "\u3057\u3093\u304B\u3093\u305b\u3093"; //some Japanese text in Unicode
String s2 = "\u30b7\u3043\u30ab\u30f3\u30bb\u30f3"; //Some Japanese text in Unicode
CultureInfo ci = new CultureInfo("ja-JP");

String.Compare 有几个重载,目前我会使用其中的一个

String.Compare(String strA, String strB, CultureInfo culture, CompareOptions options)

(其中 CompareOptions 是枚举类型)

不过,我也可以使用:

CompareInfo compareInfo = CompareInfo.GetCompareInfo("ja-JP");
compareInfo.Compare(String strA, String strB, CompareOptions options);

出于同样的目的。

CultureInfo 的 CompareInfo 对象如何在处理全球化中的这种情况(例如日语文本)时提供更多控制,例如:CompareOptions.IgnoreKanaType(其中假名是日语的第二种形式,可以使用 CompareOptions 枚举类型从字符串中忽略)。

【问题讨论】:

    标签: c# string globalization cultureinfo


    【解决方案1】:

    我相信String.Compare 将简单地委托给它提供的CompareInfo - 不必自己获取CompareInfo 会更方便。

    鉴于他们做同样的事情,我不确定你最后一个问题的真正含义。

    【讨论】:

      【解决方案2】:

      是的 Jon skeet 是对的,String.Compare 内部调用 CultureInfo.Compare 方法,这是来自 IL 的实际代码:

          public static int Compare(string strA, string strB, CultureInfo culture, CompareOptions options)
      {
          if (culture == null)
          {
              throw new ArgumentNullException("culture");
          }
          return culture.CompareInfo.Compare(strA, strB, options);
      }
      

      这里要注意的另一件事是,CultureInfo.Compare 方法内部不检查(起初)输入(文化)是否为空。它只是直接进行其他操作。如果使用 OrdinalIgnoreCase,它也会再次调用 string.Compare(string,string,StringOptions) API。 所以最好使用 String.Compare,因为在完成任何操作之前都会进行空值检查。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-20
        相关资源
        最近更新 更多