【问题标题】:CFStringCompare and case insensitive sortingCFStringCompare 和不区分大小写的排序
【发布时间】:2013-10-14 04:15:22
【问题描述】:

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

累加。从理论上讲,比较函数必须是自反的、对称的和传递的。

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

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

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

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

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

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

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

【问题讨论】:

    标签: ios sorting collation


    【解决方案1】:

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

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

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

    另一方面,ICU 图书馆声明完全符合 UCA(例如 here),这反过来又应遵守所有理论规则。

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

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

    【讨论】:

      猜你喜欢
      • 2019-01-31
      • 2020-09-13
      • 2012-06-22
      • 1970-01-01
      • 2014-11-10
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 2020-12-13
      相关资源
      最近更新 更多