【问题标题】:What kind of normalization is used by Swift string comparisons?Swift 字符串比较使用什么样的规范化?
【发布时间】: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


【解决方案1】:

这似乎是 Swift 中的错误,此后已修复。使用 Swift 3 和 Xcode 8.0,

print("\u{0071}\u{0307}\u{0323}" == "\u{0071}\u{0323}\u{0307}")

现在打印true

【讨论】:

    猜你喜欢
    • 2014-01-28
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 2011-06-21
    • 2012-02-09
    相关资源
    最近更新 更多