我遇到了这个例子,其中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_utf8在https://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)
看起来这不应该发生:
\n\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
(来源:Unicode 排序规则常见问题解答)
\n在UnicodeNormalization.cpp文件中,ucol_strcoll和ucol_strcollIter被调用,它们是ICU 项目的一部分。这可能是 Swift 标准库或 ICU 项目中的错误。\n我向 Swift Bug Tracker 报告了此问题。
| 归档时间: |
|
| 查看次数: |
216 次 |
| 最近记录: |