出于兼容性原因,我需要复制另一个应用程序的行为。它使用Unicode字符串作为标识符,但忽略大小写并执行某种规范化。通过拦截API调用,我确定它正在使用CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE, SORT_STRINGSORT, ...)
进行比较。
我可以直接为我正在考虑的字符串集中的每对字符串调用此函数,但我更喜欢可以在哈希表中使用的规范形式。
CompareStringW
使用哪些算法设置的算法?它是标准的Unicode算法吗?NormalizeString
和FoldString
生成此规范表单吗?如果可以的话,我需要通过哪些论据?编辑:正如David Heffernan指出的那样,我需要使用FoldString
以及NormalizeString
进行适当的无标记比较。
答案 0 :(得分:1)
伟大的Michael Kaplan(RIP)多年来在他的博客上提供了许多关于NLS功能的有用信息,并且在微软仅将博客内部存档之前,一些帖子已经存档。
他的A few of the gotchas of CompareString帖子提供了这些标志的描述:
NORM_IGNORECASE - 忽略大小写。这个标志的一个更好的名字可能是IGNORE_TERTIARYWEIGHT,因为它是它完成的(它掩盖了三重权重),尽管考虑这样的改变显然为时已晚。当用于比较包含依赖于重要信息的权重的字符的字符串时,它可能导致不希望的结果,幸好这是极少数情况。但是如果你不期待“ʏ”,“Y”和“y”(U + 028f,U + 0059和U + 0079,又名拉丁文小资本Y,拉丁文字母Y和拉丁文字母Y)一切都平等,那么你可能要三思而后行。你也将失去希伯来语最终形式的区别(例如“מ”和“ם”,U + 05de U + 05dd又名希伯来语信件和希伯来文最终文件),阿拉伯语(例如“ش”U + 0634又名阿拉伯语) LETTER SHEEN及其在U + feb5,U + feb6,U + feb7和U + feb8以及其他语言中的孤立,最终,初始和内侧形式(ش,ش,ش和ش)。
SORT_STRINGSORT - 将标点符号与符号相同。例如,STRING排序将co-op和co_op视为应排序的字符串,因为连字符和下划线都被视为符号。另一方面,WORD排序对连字符和撇号的处理方式不同,因此co-op和co_op不会排在一起,但合作社和合作社会排在一起。真正的文档内置于winnls.h头文件中:
//
// Sorting Flags.
//
// WORD Sort: culturally correct sort
// hyphen and apostrophe are special cased
// example: "coop" and "co-op" will sort together in a list
//
// co_op <------- underscore (symbol)
// coat
// comb
// coop
// co-op <------- hyphen (punctuation)
// cork
// went
// were
// we're <------- apostrophe (punctuation)
//
//
// STRING Sort: hyphen and apostrophe will sort with all other symbols
//
// co-op <------- hyphen (punctuation)
// co_op <------- underscore (symbol)
// coat
// comb
// coop
// cork
// we're <------- apostrophe (punctuation)
// went
// were
//
结果也可能因Windows版本而异,因为较新的版本支持以后的Unicode版本。