Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何正确地转换为用于在Cocoa中搜索的规范字符串?_Objective C_Cocoa_Search_Unicode - Fatal编程技术网

Objective c 如何正确地转换为用于在Cocoa中搜索的规范字符串?

Objective c 如何正确地转换为用于在Cocoa中搜索的规范字符串?,objective-c,cocoa,search,unicode,Objective C,Cocoa,Search,Unicode,我有一个字符串字段,我知道用户以后会想搜索它。受WWDC 2012核心数据最佳实践课程的启发,我计划将字符串的规范化版本存储到单独的字段中,以便优化搜索谓词 我主要关心的是大小写不敏感,但在规范化字符串的同时,我认为还应该规范化unicode表示。但我想确保使用了正确的规范化形式(即C、D、KC或KD)。我是否先转换成小写字母有关系吗?(本地化不是我的强项。) 因此: 调用什么方法来实现NSString的搜索规范化 确保存储规范化版本的最佳方法是什么 我将发布我的第一次尝试作为答案,但我希望听到

我有一个字符串字段,我知道用户以后会想搜索它。受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扩展来降低价格。