我有一个字符串字段,我知道用户稍后会想要搜索该字段。受到 WWDC 2012 核心数据最佳实践 session 的启发,我计划将字符串的规范化版本存储到单独的字段中,以便我可以优化我的搜索谓词。
我主要关心的是大小写不敏感,但是当我规范化字符串时,我认为我还应该规范化 unicode 表示形式。但我想确保我使用正确的标准化形式(即 C、D、KC 或 KD)。我是否先转换为小写有什么关系吗? (本地化不是我的强项。)
所以:
- 调用哪些正确方法来对 NSString 进行搜索规范化?
- 确保存储规范化版本的最佳方法是什么。
我将发布我的第一次尝试作为答案,但我很想听听我错在哪里、其他建议或改进。 (不幸的是,虽然他们在该视频中显示了搜索谓词,但我认为他们没有显示 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/