Swift中的字符串比较不是传递性的

Pin*_*nch 10 swift

我遇到了这个例子,其中s1 <s2和s2 <s3但是(s1 <s3)为假:

var str1 = "????"
var str2 = "??????"
var str3 = "????:"

print(str1 < str2)       // True
print(str2 < str3)       // True
print(str1 < str3)       // False (?)
Run Code Online (Sandbox Code Playgroud)

这是一个错误还是真的,我们不能依赖字符串比较是传递的(这打破了我对字符串数组的排序)?我正在运行Swift 3.

更新:所有这些都是假的

print(str1 < str3)       // False (?)
print(str1 == str3)       // False (?)
print(str1 > str3)       // False (?)
Run Code Online (Sandbox Code Playgroud)

所以有些字符串不能相互比较?

更新:如何更多运算符工作的Swift字符串中的注释指出<运算符的源代码位于https://github.com/apple/swift/blob/master/stdlib/public/core/String.swift,并且比较通过处理_swift_stdlib_unicode_compare_utf8_utf8https://github.com/apple/swift/blob/master/stdlib/public/stubs/UnicodeNormalization.cpp

更新:这些都是真的

print(str1 >= str3)  // True
print(str1 <= str3)  // True
Run Code Online (Sandbox Code Playgroud)

更新:也存在问题String.localizedCompare().有两个字符串,其中s1 = s2但s2> s1:

str1 = "b?o toàn"
str2 = "b?o t?n"

print(str1.localizedCompare(str2) == .orderedSame) // true
print(str2.localizedCompare(str1) == .orderedDescending) // true
Run Code Online (Sandbox Code Playgroud)

Pal*_*lle 2

看起来这不应该发生:

\n
\n

问:[Unicode 排序算法] 是否维护传递一致性?

\n

答:是的,对于任何字符串 A、B 和 C,如果 A < B 且 B < C,则 A < C。但是,实现者必须小心地生成在优化时准确再现 Unicode 排序算法结果的实现他们自己的算法。执行粗心优化 \xe2\x80\x94 很容易,特别是对于未通过此测试的增量比较算法 \xe2\x80\x94。其他需要检查的项目是重音基础之间的正确区别。例如,序列 <u-macron, u-diaeresis-macron> 应该比较小于 <u-macron-diaeresis, u-macron>;这是基于重音权重的次要区别,重音权重必须与其各自基本字母的主要权重正确关联。

\n
\n

(来源:Unicode 排序规则常见问题解答

\n

UnicodeNormalization.cpp文件中,ucol_strcollucol_strcollIter被调用,它们是ICU 项目的一部分。这可能是 Swift 标准库或 ICU 项目中的错误。\n我向 Swift Bug Tracker 报告了此问题

\n