gpt4 book ai didi

delphi - 是否有适用于 Delphi 的 Unicode 归类算法 (UCA) 代码?

转载 作者:行者123 更新时间:2023-12-03 18:16:47 24 4
gpt4 key购买 nike

根据 Unicode 技术标准 #10 (UCA) 进行排序,这与符合 Unicode 是不同的,如果您想知道这一点,它不仅意味着排序/排序,还意味着比较,“字符串 1 是否相等”的问题到字符串 2"。有时,为了整理和比较的目的,两个字符串中不同值的代码点被认为是相等的,至少这 blog post 暗示了这一点。这是从 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::Collat​​ion 库?怎么办?

Update AnsiCompareStr 将调用 Win32 CompareString 并将处理一些特定于区域设置的情况,如上述,并且从互联网上阅读,经典的 Windows unicode 归类行为和 UCA 正在缓慢但不完全融合,UCA 似乎是经过更改以使其更像 Windows 归类的行为。

最佳答案

(a) 没有。Delphi 的 AnsiCompareStr 和合作。包装 Win32 CompareString功能,does not follow Unicode 归类算法。

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

虽然这对您来说可能不是必需的。你看到你的行为的原因是因为你正在使用 CompareStr而不是 AnsiCompareStr .非 ANSI 版本是在 SysUtils 中用 asm 编写的,逐字符比较,不考虑等价或组合字符。不区分大小写的版本,CompareText , 也只适用于 a-z。 ANSI 版本在内部调用 CompareString,它可以识别区域并处理所有这些情况。

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

关于delphi - 是否有适用于 Delphi 的 Unicode 归类算法 (UCA) 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9233606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com