NSPredicate 和丹麦字母 å 给出错误的结果

Posted

技术标签:

【中文标题】NSPredicate 和丹麦字母 å 给出错误的结果【英文标题】:NSPredicate and danish letter å gives wrong results 【发布时间】:2014-05-06 13:32:34 【问题描述】:

丹麦语只有 3 个非标准字符:åøæ

当我尝试使用以下谓词搜索我的 Core Data 实体时:

name CONTAINS[cd] "ø" // correct results
name CONTAINS[cd] "æ" // correct results
name CONTAINS[cd] "å" // wrong results - with 'å' and 'a'

前 2 个谓词正常工作,但最后一个谓词不能正常工作。结果中同时包含“å”和“a”字母。

只有这一个字母有什么特别之处?

【问题讨论】:

【参考方案1】:

我建议您将查询字符串设为小写并且不要使用 [cd] 作为谓词语句的一部分,这既是为了优化核心数据,也是为了返回正确的结果。

工作示例:

NSArray *ar = @[@"å",@"a",@"åa"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self CONTAINS %@", @"å"];
NSArray *filteredArray = [ar filteredArrayUsingPredicate:predicate];
NSLog(@"Results: %@",filteredArray); // which returns (å,åa)

【讨论】:

【参考方案2】:

这是变音符号搜索的正确行为。如果您指定 d 参数,核心数据将运行变音符号不敏感搜索。这意味着它会忽略所有重音符号。

该字符是“特殊”的,因为它具有多种 unicode 表示形式,并且您的搜索也会根据商店中保存的 unicode 值产生不同的结果。

在 objc.io https://www.objc.io/issues/9-strings/unicode/ 上的字符串问题中有一个关于该字符的很好的解释

【讨论】:

以上是关于NSPredicate 和丹麦字母 å 给出错误的结果的主要内容,如果未能解决你的问题,请参考以下文章

新作 | 丹麦Solrødgård水处理厂:可以野餐的污水厂 / Henning Larson

JavaMail:“域包含字符串中的控件或空格”错误消息,因为域包含丹麦字符

MYSQL 数据库字符集问题

MacOS wc(wordcount)计算带有UTF-8字符Å的错误单词

Solrødgård 水处理厂,景观中的景观设计 / Henning Larsen

使用 std::wifstream 读取带有特殊字符的 unicode 文件