CFStringCompare和不区分大小写的排序

时间:2013-10-07 14:26:49

标签: ios sorting collation

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

度Acc。理论上,比较函数必须是反身的,对称的和传递的。

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

以下是一个示例问题: CFStringCompare与标志NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch产生:

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

换句话说,当B> A!

时,A> B;

我们测试了更多旗帜组合:

  • kCFCompareNonliteral表现出类似的问题
  • kCFCompareLocalized被证明是最糟糕的选择(大多数问题)

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

1 个答案:

答案 0 :(得分:0)

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

首先,其他人观察到了类似的问题,例如this link。请注意,我们还观察到德国ß的许多问题。我偶然选择了另一个例子。

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

另一方面,有ICU图书馆,他们宣布完全遵守UCA(例如here),而UCA又应遵守所有理论规则。

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

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