Objective c 如何正确地转换为用于在Cocoa中搜索的规范字符串?
我有一个字符串字段,我知道用户以后会想搜索它。受WWDC 2012核心数据最佳实践课程的启发,我计划将字符串的规范化版本存储到单独的字段中,以便优化搜索谓词 我主要关心的是大小写不敏感,但在规范化字符串的同时,我认为还应该规范化unicode表示。但我想确保使用了正确的规范化形式(即C、D、KC或KD)。我是否先转换成小写字母有关系吗?(本地化不是我的强项。) 因此:Objective c 如何正确地转换为用于在Cocoa中搜索的规范字符串?,objective-c,cocoa,search,unicode,Objective C,Cocoa,Search,Unicode,我有一个字符串字段,我知道用户以后会想搜索它。受WWDC 2012核心数据最佳实践课程的启发,我计划将字符串的规范化版本存储到单独的字段中,以便优化搜索谓词 我主要关心的是大小写不敏感,但在规范化字符串的同时,我认为还应该规范化unicode表示。但我想确保使用了正确的规范化形式(即C、D、KC或KD)。我是否先转换成小写字母有关系吗?(本地化不是我的强项。) 因此: 调用什么方法来实现NSString的搜索规范化 确保存储规范化版本的最佳方法是什么 我将发布我的第一次尝试作为答案,但我希望听到
我将发布我的第一次尝试作为答案,但我希望听到我错在哪里,其他建议或改进。(不幸的是,虽然他们在视频中显示了搜索谓词,但我认为他们没有显示会话中的代码。)我目前计划做的是覆盖字段的setter,如下所示:
- (void)setName:(NSString *)value
{
[self willChangeValueForKey:@"name"];
[self setPrimitiveValue:value forKey:@"name"];
[self didChangeValueForKey:@"name"];
//Store normalized for for searching
[self willChangeValueForKey:@"searchName"];
[self setPrimitiveValue:[[value lowercaseStringWithLocale:[NSLocale currentLocale]] decomposedStringWithCompatibilityMapping] forKey:@"searchName"];
[self didChangeValueForKey:@"searchName"];
}
我还将searchName属性设置为只读。对于您描述的用例,选择预合成或分解(C或D;尽管预合成会节省一些空间)并不重要,但请仔细考虑您想要的是规范还是兼容(K形式)。有一个很好的图表总结了这些差异(图6): 也就是说:如果有人搜索“ſ”(a“”),您是否要匹配“s”(反之亦然)?这些被视为“格式差异”,因此您不应该用这些表单替换用户输入的文本(因为您丢失了数据),但您可能希望在搜索时忽略它们 对于不区分大小写的比较,仅仅将两个字符串都设置为小写并进行比较是不够的。它适用于英语,但有些语言的小写和大写之间的映射(如果存在这种区别的话)并不清楚。W3CWiki有一个。不幸的是,您无法通过将数据保存在一个“case”中来优化存储中的这一点,您只能在同时知道字符串和区域设置的情况下进行适当的比较
幸运的是,在使用
NSString
时,它允许您指定NSCaseInsensitiveSearch
选项和区域设置(如果您知道),这将为您处理这些大小写折叠问题(同时查看NSDiacriticInsensitiveSearch
和NSWidthInsensitiveSearch
,看看您是否也想对这些差异保持不可知状态).这是一个答案,还是您最初问题的附录?如果是后者,您只需编辑您的初始问题以包含此信息。这是一个答案。正如我在问题末尾所讨论的,我已尽我所能提供了答案。希望有人验证我的答案,指出错误/限制,或者提供更好的答案。感谢编辑Josh。不幸的是,我忘记了SE不支持Github扩展来降低价格。