【发布时间】:2016-09-19 21:39:16
【问题描述】:
Elsewhere I've seen it told Swift 的比较使用 NFD 归一化。
但是,running in the iSwift playground 我发现了
print("\u{0071}\u{0307}\u{0323}" == "\u{0071}\u{0323}\u{0307}");
给出false,尽管this being an example straight from the standard是“规范等价”,其中Swift's documentation claims to follow。
那么,Swift 执行了什么样的规范化,这是一个错误吗?
【问题讨论】:
-
好问题!此外,据我了解文档,
"\u{0071}\u{0307}\u{0323}".precomposedStringWithCanonicalMapping应返回"\u{0071}\u{0323}\u{0307}",即按定义顺序组合标记的 NFC 表单。但事实并非如此,因为可以通过print(Array(string.unicodeScalars))进行验证。 -
source code 是否提供线索? “根据其 NFD 形式等效的字符串被认为是相等的。...” - 据我了解,您的字符串具有相同的 NFC 形式,但 NFD 形式不同。
-
@MartinR 这不是 NFD 与 NFC,因为 NFC 只是 NFD 后跟“规范组合”,它发生在重新排序之后(这是从“完全分解和规范排序的字符串由Unicode 规范化算法的另一个子部分,称为规范组合算法。”)我已经检查了 Python 的
unicodedata.normalize的行为,Python 似乎同意 NFD 应该重新排序。 -
我假设通过深入挖掘 Swift 源代码可以找到答案......最终,如果我没看错的话,ICU 库将用于字符串比较。 – 您也可以在lists.swift.org/mailman/listinfo/swift-users 询问。
-
@Veedrac 您可以使用带有免费 Apple ID 的 bugreport.apple.com;您不必成为付费开发者计划的成员。任何人都可以通过bugs.swift.org 报告 Swift 问题。
标签: string swift unicode comparison unicode-normalization