String Swift字符串比较使用哪种规格化?

String Swift字符串比较使用哪种规格化?,string,swift,unicode,comparison,unicode-normalization,String,Swift,Unicode,Comparison,Unicode Normalization,Swift的比较使用NFD标准化 然而,我发现 print("\u{0071}\u{0307}\u{0323}" == "\u{0071}\u{0323}\u{0307}"); 给出了false,尽管存在“规范等价性”,这是错误的 那么,Swift执行了什么样的规范化,这是一个bug吗?这似乎是Swift中的bug,后来被修复了。使用Swift 3和Xcode 8.0 print("\u{0071}\u{0307}\u{0323}" == "\u{0071}\u{0323}\u{0307}")

Swift的比较使用NFD标准化

然而,我发现

print("\u{0071}\u{0307}\u{0323}" == "\u{0071}\u{0323}\u{0307}");
给出了
false
,尽管存在“规范等价性”,这是错误的


那么,Swift执行了什么样的规范化,这是一个bug吗?

这似乎是Swift中的bug,后来被修复了。使用Swift 3和Xcode 8.0

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

现在打印
true

好问题!另外,据我所知,文档,
“\u{0071}\u{0307}\u{0323}”。precomposedStringWithCanonicalMapping
应返回
“\u{0071}\u{0323}\u{0307}”
,即按定义顺序组合标记的NFC表单。但事实并非如此,正如人们可以通过
print(Array(string.unicodeScalars))
验证的那样,这是否提供了线索?“根据其NFD形式等价的字符串被视为相等的…”-据我所知,您的字符串具有相同的NFC形式,但不同的NFD形式。@MartinR这不是NFD与NFC,因为NFC只是NFD后跟“规范组合”,它发生在重新排序之后(从“完全分解并按规范排序的字符串由Unicode规范化算法的另一个子部分(称为规范组合算法)处理。”)我已经检查了Python的unicodedata.normalize的行为,Python似乎同意NFD应该重新排序。我假设可以通过深入研究Swift源代码找到答案……最终,如果我看得正确,ICU库用于字符串比较。-您也可以问@Veedrac您可以使用bugrep您不必是付费开发者计划的成员。任何人都可以通过以下网址报告Swift问题:。