3

Unicode 技术标准 #10 (UCA) 下的排序规则,这与 Unicode 兼容是不同的,如果您对此感到疑惑,它不仅意味着排序/排序,还意味着比较,“字符串 1 是否等于字符串 2”的问题”。有时,出于排序和比较的目的,两个字符串中的值不同的代码点被认为是相等的,至少从 Perl 标准库的角度讨论的这篇博客文章暗示了这一点。

我想知道的是,(a)Delphi XE2 是否已经完全实现了整个Unicode Collat​​ion Spec,并且(b)如果没有,第三方库会这样做吗?

示例代码:

Str1 := Chr($212B);
Str2 := Chr($C5);
n := CompareStr(Str1,Str2); // in delphi this is not zero, under UCA rules, should be 0.

根据 Unicode 归类规范,Unicode 归类应考虑所有上述代码点的等价比较。从二进制的角度来看,这没有任何意义,所以我很高兴 Delphi 中的 CompareStr 和 perl 中的 cmp(来自链接的文章)都没有受到 Unicode 故障的污染,但是如果你想做一个符合 unicode 的怎么办Delphi 中的排序规则,比如 perl Unicode::Collat​​ion 库?如何?

更新 AnsiCompareStr将调用 Win32CompareString并会处理一些类似于上述区域设置的特定情况,并且通过在互联网上阅读,经典的 Windows unicode 整理行为和 UCA 正在缓慢但不完全融合,UCA 似乎是一个被改变的人它更像是 Windows 排序规则。

4

1 回答 1

7

(a) 没有。Delphi's AnsiCompareStrand co。包装 Win32 CompareString函数,它不遵循Unicode 排序算法。

(b) ICU项目确实支持它,但 Delphi 包装器ICU4PAS自 2007 年以来一直没有更新。

不过,这对您来说可能不是必需的。您看到您的行为的原因是因为您使用的是CompareStr而不是AnsiCompareStr。非 ANSI 版本在 SysUtils 中用 asm 编写,逐个字符比较,不考虑等价或组合字符。不区分大小写的版本CompareText也仅适用于 az。ANSI 版本在内部调用 CompareString,它是区域设置感知的并且确实处理所有这些情况。

请注意,这仅适用于 SysUtils 中的例程。在 StrUtils.pas 中,非 ANSI 版本只是 ANSI 版本的内联包装器,因此它们都是区域设置感知的。

于 2012-02-10T19:45:08.193 回答