Unicode 技术标准 #10 (UCA) 下的排序规则,这与 Unicode 兼容是不同的,如果您对此感到疑惑,它不仅意味着排序/排序,还意味着比较,“字符串 1 是否等于字符串 2”的问题”。有时,出于排序和比较的目的,两个字符串中的值不同的代码点被认为是相等的,至少从 Perl 标准库的角度讨论的这篇博客文章暗示了这一点。
我想知道的是,(a)Delphi XE2 是否已经完全实现了整个Unicode Collation 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::Collation 库?如何?
更新 AnsiCompareStr
将调用 Win32CompareString
并会处理一些类似于上述区域设置的特定情况,并且通过在互联网上阅读,经典的 Windows unicode 整理行为和 UCA 正在缓慢但不完全融合,UCA 似乎是一个被改变的人它更像是 Windows 排序规则。