delphi 为什么CompareStringW WinAPI调用顺序是小写字母在大写字母之前?

6tqwzwtp  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(172)

我用这个来进行字符串排序,但是它在“A”之前排序“a”。在我看来,正确的解决方案应该是相反的。
有没有可能这样排序?
我的代码示例:

CompareStringW(LOCALE_USER_DEFAULT, NORM_LINGUISTIC_CASING or SORT_STRINGSORT, PChar(Str1), Length(Str1), PChar(Str2), Length(Str2));
1hdlvixo

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之后。

相关问题