我正在尝试在一个小型桌面应用程序中交出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(其中Kana是日语的第二种形式,可以使用CompareOptions枚举类型从字符串中忽略)。
答案 0 :(得分:1)
我相信String.Compare
只会委托给它提供的CompareInfo
- 不必自己掌握CompareInfo
就更方便了。
鉴于他们做同样的事情,我不确定你的最终问题究竟意味着什么。
答案 1 :(得分:0)
是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方法在内部不检查(首先)输入(culture)是否为null。它只是直接做其他操作。如果使用OrdinalIgnoreCase,它还会再次调用string.Compare(string,string,StringOptions)API。 所以最好使用String.Compare,因为在完成任何操作之前都会进行空检查。