1

我们的目标是为 SQLite 数据库编写不区分大小写的排序规则。我们为多个平台执行此操作,但 iOS 似乎存在一致的问题,这些问题(偶尔)表现在损坏的数据库索引中。经过长时间的实验,我们得出结论,罪魁祸首是 CFStringCompare() 函数,它违反了理论规则。

会计。对理论而言,比较函数必须是自反的、对称的和传递的。

我们所做的是生成随机字符串并测试 CFStringCompare() 是否满足上述属性。

这是一个示例问题:CFStringCompare with flags NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch 产生:

"Я7;1FC9" > "SДA`\"0l"
"SДA`\"0l" > "Я7;1FC9"

换句话说,当 B>A 时,A>B!

我们测试了更多的标志组合:

  • kCFCompareNonliteral 显示了类似的问题
  • kCFCompareLocalized 被证明是最糟糕的选择(大多数问题)

有人知道在 iOS 下实现不区分大小写比较的安全方法吗?

4

1 回答 1

0

好的,没有回复,所以我会尝试自己回复。

首先,其他人观察到类似的问题,例如这个链接。请注意,我们还观察到德语 ß 存在很多问题。我偶然选择了另一个例子。

这应该足以说明 CFStringCompare 有错误的实现,不能用于排序。

另一方面,有 ICU 图书馆,他们宣布完全遵守 UCA(例如这里),这反过来又应该遵守所有的理论规则。

所以我的回答是:CFStringCompare 有问题,使用 ICU。

(由于 ICU 图书馆的庞大规模,我希望得到另一个答案)

于 2013-10-09T13:18:37.473 回答