我用这个来进行字符串排序,但是它在“A”之前排序“a”。在我看来,正确的解决方案应该是相反的。有没有可能这样排序?我的代码示例:
CompareStringW(LOCALE_USER_DEFAULT, NORM_LINGUISTIC_CASING or SORT_STRINGSORT, PChar(Str1), Length(Str1), PChar(Str2), Length(Str2));
1hdlvixo1#
CompareStringW()按区域设置排序,这意味着与字符的Map值的大小无关(code point)是. I tried to find generic rules for the German language,但是将小写字母排在大写字母之前既不错误也不正确。在词典中,您很可能会发现小写单词排在大写单词之前,CompareStringW()也是如此-不仅对于德语,而且对于每种语言/区域设置都是如此。您期望大写字母总是排在第一位,这仅仅是因为传统的处理方式是根据Map值对字符/graphemes进行排序:在ASCII中大写拉丁字母先出现,然后是小写拉丁字母。查看其他书写系统(即Greek and Cyrillic) Unicode also defines first the uppercase letters, then the lowercase ones:| 字母|大写字母|小的|| - -|- -|- -|| 拉丁语H| U+0048 H| U+0068h|| 希腊三角洲|U+0394 Δ| U+03B4 δ|| 西里尔·哲|U+0416| U+0436|| 亚美尼亚XEH| U+053D| U+056D|| 乔治·唐|U+10A3| U+10D3|| 罗马(数字)四|U+2163 Ⅳ| U+2173 Ⅳ|然而,这与语言本身如何对待/看待它无关,也不能解释重音字母(例如á和š)-CompareStringW()的排序结果比仅查看字符的值更准确。在许多语言中,您希望将Ü排序在U之后,而不是在Z之后(当然也不是在z之后)。相比之下, Delphi 的CompareStr()只通过查看代码点来进行排序,这是一种旧的/简单的/简单的方式,所以f.e.
CompareStringW()
á
š
Ü
U
Z
z
CompareStr()
A
a
1条答案
按热度按时间1hdlvixo1#
CompareStringW()
按区域设置排序,这意味着与字符的Map值的大小无关(code point)是. I tried to find generic rules for the German language,但是将小写字母排在大写字母之前既不错误也不正确。在词典中,您很可能会发现小写单词排在大写单词之前,CompareStringW()
也是如此-不仅对于德语,而且对于每种语言/区域设置都是如此。您期望大写字母总是排在第一位,这仅仅是因为传统的处理方式是根据Map值对字符/graphemes进行排序:在ASCII中大写拉丁字母先出现,然后是小写拉丁字母。查看其他书写系统(即Greek and Cyrillic) Unicode also defines first the uppercase letters, then the lowercase ones:
| 字母|大写字母|小的|
| - -|- -|- -|
| 拉丁语H| U+0048 H| U+0068h|
| 希腊三角洲|U+0394 Δ| U+03B4 δ|
| 西里尔·哲|U+0416| U+0436|
| 亚美尼亚XEH| U+053D| U+056D|
| 乔治·唐|U+10A3| U+10D3|
| 罗马(数字)四|U+2163 Ⅳ| U+2173 Ⅳ|
然而,这与语言本身如何对待/看待它无关,也不能解释重音字母(例如
á
和š
)-CompareStringW()
的排序结果比仅查看字符的值更准确。在许多语言中,您希望将Ü
排序在U
之后,而不是在Z
之后(当然也不是在z
之后)。相比之下, Delphi 的
CompareStr()
只通过查看代码点来进行排序,这是一种旧的/简单的/简单的方式,所以f.e.A
位于小写的a
之前,Ü
出现在小写的z
之后。