答案 0 :(得分:9)
您说自己在调用Windows API调用时遇到问题。你可以发布代码,所以这里的人可以看到它失败的原因吗?它并不像看起来那么难,但确实需要一些关心。 RtlCompareUnicodeStrings()
级别太低的ISTM。
我找到了一些解决方案:
您可以使用Windows API函数CompareStringEx。这将使用Unicode特定的排序规则类型进行比较。您可以指定完成此操作的方式(请参阅链接)。它确实需要宽字符串,即PWideChar指向它们。如果你在调用它时遇到问题,请给出一个声音,我会尝试添加一些演示代码。
为了使这个或多或少可移植,您可以编写一个比较两个字符串的函数,并使用条件定义来为平台选择不同的比较API。
答案 1 :(得分:7)
尝试使用CompareStr表示区分大小写,或CompareText表示区分大小写,如果您希望您的排序在任何区域设置中完全相同。
如果您希望自己的排序特定于用户的区域设置,则使用AnsiCompareStr表示区分大小写,或AnsiCompareText表示不区分大小写。
有关详细信息,请参阅:How can I get TStringList to sort differently in Delphi。
答案 2 :(得分:2)
在Unicode中,字符的数字顺序当然不是排序顺序。 HeartWare提到的AnsiCompareText在比较字符时会考虑区域设置细节,但是,正如您所发现的那样,对排序顺序没有任何作用。您正在寻找的是一种语言的校对序列,它指定了考虑变音符号等语言的字母排序顺序。在旧的Ansi Code页面中暗示了它们,尽管这些并没有说明使用相同字符集对语言之间的差异进行排序。
我检查了D2010文档。除了一些TIB *组件,我没有找到任何链接。 C ++构建器似乎确实有一个比较函数,它将整理考虑在内,但这在Delphi中没什么用处。在那里,您可能必须直接使用一些Windows的API函数。
文档:
“排序”整理“全部”文章由迈克尔·卡普兰(Michael Kaplan)撰写,他非常了解Unicode的所有内容以及各种语言的复杂性。从D2006移植到D2009时,他的博客对我来说非常宝贵。
答案 3 :(得分:1)
你试过AnsiCompareText吗?虽然它被称为“Ansi”,但我相信它需要一个特定于操作系统的Unicode比较例程......
它还应该使您免受跨平台依赖性的影响(假设Embarcadero在其目标的各种操作系统中提供兼容版本)。
我不知道比较对各种奇怪的Unicode编码字符串的方式有多好,但是尝试一下,让我们知道结果......