Winapi CompareStringW使用哪种无案例比较算法?
出于兼容性原因,我需要复制另一个应用程序的行为。它使用Unicode字符串作为标识符,但忽略大小写并执行某种规格化。通过拦截API调用,我确定它正在使用Winapi CompareStringW使用哪种无案例比较算法?,winapi,unicode-normalization,Winapi,Unicode Normalization,出于兼容性原因,我需要复制另一个应用程序的行为。它使用Unicode字符串作为标识符,但忽略大小写并执行某种规格化。通过拦截API调用,我确定它正在使用CompareStringW(LOCALE\u USER\u DEFAULT,NORM\u IGNORECASE,SORT\u STRINGSORT,…)进行比较 我可以直接为我正在考虑的字符串集中的每一对字符串调用这个函数,但我更喜欢在哈希表中使用的规范形式 有人知道设置了这些标志后,CompareStringW使用什么算法吗?它是标准的Uni
CompareStringW(LOCALE\u USER\u DEFAULT,NORM\u IGNORECASE,SORT\u STRINGSORT,…)
进行比较
我可以直接为我正在考虑的字符串集中的每一对字符串调用这个函数,但我更喜欢在哈希表中使用的规范形式
CompareStringW
使用什么算法吗?它是标准的Unicode算法吗NormalizeString
和FoldString
生成此规范格式吗?如果可以,我需要传递哪些参数FoldString
以及NormalizeString
来进行适当的无案例比较。伟大的迈克尔·卡普兰(RIP)多年来,他在自己的博客上提供了很多关于NLS功能的有用信息,在微软将博客改为内部博客之前,一些帖子已经存档
他的帖子描述了这些旗帜:
正常忽略案例-忽略案例。这个标志的一个更好的名称可能是iGiReLogIII重,因为这是它完成的(它掩盖了第三重),尽管显然已经太迟了,不能考虑这样的改变。当用于比较包含依赖于重要信息权重的字符的字符串时,它可能会导致不希望的结果,谢天谢地,这种情况非常少。但如果你不希望“ʏ”、“Y”和“Y”(U+028f、U+0059和U+0079,又称拉丁字母小写Y、拉丁字母大写Y和拉丁字母小写Y)都是相等的,那么你可能需要三思而后行,把这面旗帜扔进这个组合中。您还将失去希伯来语(例如“מ”和“ם”、U+05de U+05dd a.k.a.希伯来语字母MEM和希伯来语字母final MEM)、阿拉伯语(例如“ش”U+0634 a.k.a.阿拉伯字母SHEEN及其独立、最终、首字母和中间形式)的区分(ﺵ, ﺶ, ﺷ, 及ﺸ) 在U+feb5、U+feb6、U+feb7和U+feb8以及其他语言中
SORT\u STRINGSORT将标点符号视为符号。例如,字符串排序将co-op和co-op视为应一起排序的字符串,因为连字符和下划线都被视为符号。另一方面,单词排序将以不同的方式处理连字符和撇号,以便co-op和co-op不会一起排序但是合作社和合作社会这样做。这方面的真正文档内置在winnls.h头文件中:
//
//排序标志。
//
//单词排序:文化上正确的排序
//连字符和撇号是特例
//示例:“合作社”和“合作社”将在列表中一起排序
//
//co_op NormalizeString根本不转换字母大小写,所以它没有任何帮助。我猜它使用的是Unicode排序算法。你可以查一下。我猜它们的低级函数是对的。
//
// 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
//