CLR 全面透彻解析:国际应用程序
2008-12-01 11:52:36 来源:WEB开发网Framework 提供三种字符串比较模式。序数、单词以及字符串。序数比较的依据是待比较的每个字符的数值,这意味着在基于 String.CompareOrdinal 的排序中,"alphabet" 会大于 "Alphabet"。默认比较方式是单词比较。这种方式是区分文化的,可能会将某些非字母数字字符(如连字符)视为特例。它可能会赋予这些字符很小的权重或重要性,因此,举例而言,"a-lphabet" 和 "alphabet" 在排序时彼此靠近。字符串比较也区分文化,但是它没有特例,非字母数字字符均排在字母数字字符之前。
如果要使用 String.Compare 对 en-US 进行区分文化的比较,您可能会发现 "Alphabet" 大于 "alphabet"。如果对其进行忽略大小写的序数比较,它们会相等。System.Globalization.CompareOptions 包括九种不同的选项,它们指出了在排序时哪些参数会被纳入考虑范畴。
每种文化都有其自己的字符集和排序顺序。有些甚至有不止一种。例如,es-ES,即西班牙语(西班牙),在默认情况下使用国际化排序,但也可以选择使用传统的排序顺序。zh-CN,即中文(中国),在默认情况下按拼音排序,但也可以按笔画数排序。Framework 中的每个 CultureInfo 对象都有一个 CompareInfo 属性,可用来对字符串进行比较。Framework 中存储着此数据。
一般而言,对于排序和显示更适合使用区分文化的排序。但是,在测试字符串是否相等时,尤其是在某些可能会涉及安全隐患的情况下,序数比较无疑是最佳选择。序数比较只关注待比较字符的值;因此它始终是一致的,而区分文化的比较则可能会由于使用文化的不同而得到不同的结果。
使用区分文化的字符串比较方法时,最常被引用的一个涉及安全因素的问题就是“土耳其语 I 问题”。在大多数拉丁字母字符集中,字符 i (u0069) 只是字符 I (u0049) 的小写形式。多数人在使用这些字母字符集时根本没有意识到其中可能会有任何变体,因此都会将其视为默认行为。但是在土耳其语中 (tr-TR),该映射却是错误的。字符 i 的大写形式是字符 İ (u0130),也就是带一个点的大写字母 I。类似地,字符 I 的小写形式是 ı (u0131),也就是没有点的小写字母 i。
更多精彩
赞助商链接