哪些无壳比较算法正在使用比较



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

我可以在我正在考虑的一组字符串中直接为每个字符串直接调用此功能,但我更喜欢可以在哈希表中使用的规范形式。

  1. 有人知道算法CompareStringW与设置的标志使用了什么?它是标准的Unicode算法吗?
  2. 我可以使用NormalizeStringFoldString生成此规范形式吗?如果可以的话,我需要通过什么论点?

编辑:正如大卫·赫弗南(David Heffernan(指出的那样,我需要使用FoldString以及NormalizeString进行适当的无壳比较。

伟大的迈克尔·卡普兰(RIP(多年来提供了许多有关NLS功能的有用信息,并且在Microsoft将博客"仅在内部内置为内部之前已经存档。p>他的几个比较帖子的陷阱提供了这些标志的描述:

norm_ignorecase - 忽略案例。这个标志的更好名称可能被忽略了tertiary量,因为那是它完成的(它掩盖了三级权重(,尽管考虑到这种更改显然为时已晚。在比较包含依赖重量的字符串的字符串时,可能会导致不良结果,这是重要信息的重量,这是很少的情况。但是,如果您不期望" y" y y y&quot" y y y y"(u 028f,u 0059和u 0079,又称拉丁字母小资本y,拉丁字母y和拉丁字母小y(,然后您可能想三思而后行,将此旗帜扔进混合。您还将失去希伯来语的最终形式的区别(例如" and and and and"," and",u 05de u 05dd a.k.a.0634 A.K.A.阿拉伯信函Sheen及其孤立的,最终,初始和内侧形式(ﺵ,ﺶ,ﺷ,ﺷ和ﺸ(,u feb5,u feb6,u feb7和u feb8和其他语言。<</P>

sort_stringsort - 将标点符号与符号相同。例如,一个字符串排序将CO-OP和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版本。

最新更新