我们的目标是为 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 下实现不区分大小写比较的安全方法吗?