objective-c - 如何正确转换为规范字符串以在 Cocoa 中进行搜索?

标签 objective-c cocoa search unicode

我有一个字符串字段,我知道用户稍后会想要搜索该字段。受到 WWDC 2012 核心数据最佳实践 session 的启发,我计划将字符串的规范化版本存储到单独的字段中,以便我可以优化我的搜索谓词。

我主要关心的是大小写不敏感,但是当我规范化字符串时,我认为我还应该规范化 unicode 表示形式。但我想确保我使用正确的标准化形式(即 C、D、KC 或 KD)。我是否先转换为小写有什么关系吗? (本地化不是我的强项。)

所以:

  1. 调用哪些正确方法来对 NSString 进行搜索规范化?
  2. 确保存储规范化版本的最佳方法是什么。

我将发布我的第一次尝试作为答案,但我很想听听我错在哪里、其他建议或改进。 (不幸的是,虽然他们在该视频中显示了搜索谓词,但我认为他们没有显示 session 中的代码。)

最佳答案

对于您描述的用例,选择预组合还是分解(C 或 D;尽管使用预组合会节省一些空间)并不重要,但请仔细考虑您是想要规范还是兼容性(K形式)。 TR15有一个很好的图总结了差异(图 6):

也就是说:如果有人搜索“ſ”(a ' long s '),您是否想要匹配“s”(反之亦然)?这些被视为“格式区别”,因此您不应该用这些表单替换用户输入的文本(因为您会丢失数据),但您可能希望在搜索时忽略它们。

对于不区分大小写的比较,仅仅将两个字符串都变成小写并进行比较是不够的。它适用于英语,但有些语言中小写和大写之间的映射(如果存在这种区别)并不那么清晰。 W3C wiki 有一个 nice summary of these "case folding" issues 。不幸的是,您无法通过将数据保存在一个“案例”中来优化存储,只有当您知道字符串和区域设置时才能进行正确的比较。

幸运的是,当使用 NSString 时,它是 -compare:options:range:locale:让您指定一个 NSCaseInsensitiveSearch 选项和区域设置(如果您知道),它将为您处理这些大小写折叠问题(另请查看 NSDiacriticInsensitiveSearch NSWidthInsensitiveSearch 来看看您是否也想不知道这些差异)。

关于objective-c - 如何正确转换为规范字符串以在 Cocoa 中进行搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16741632/

相关文章:

objective-c - UITableViewController的表调整大小

ios - 将 NSObject 转换为 NSDictionary

objective-c - 在单个文档中存储多个文件

templates - 创建针对特定索引ES 6.x的Elasticsearch模板

javascript - 使用 SQL 查询 javascript 对象?

objective-c - 为自定义单元格设置 uitableviewcell 高度

objective-c - iOS:UITableView 选择性触摸

cocoa - 更改 NSTextField 中的行高(前导)

javascript - 使用 JXA 以编程方式创建和填充 NSWindow

algorithm - 整理书籍 - 搜索相关问题