如何比较包含非英语字符的unicode字符串按字母顺序排序?

时间:2011-08-13 15:19:35

标签: delphi unicode collation

4 个答案:

答案 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编码字符串的方式有多好,但是尝试一下,让我们知道结果......