什么无壳的比较算法是CompareStringW使用?

时间:2018-02-22 01:06:11

标签: winapi unicode-normalization

出于兼容性原因,我需要复制另一个应用程序的行为。它使用Unicode字符串作为标识符,但忽略大小写并执行某种规范化。通过拦截API调用,我确定它正在使用CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE, SORT_STRINGSORT, ...)进行比较。

我可以直接为我正在考虑的字符串集中的每对字符串调用此函数,但我更喜欢可以在哈希表中使用的规范形式。

  1. 有谁知道CompareStringW使用哪些算法设置的算法?它是标准的Unicode算法吗?
  2. 我可以使用NormalizeStringFoldString生成此规范表单吗?如果可以的话,我需要通过哪些论据?
  3. 编辑:正如David Heffernan指出的那样,我需要使用FoldString以及NormalizeString进行适当的无标记比较。

1 个答案:

答案 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版本。