【问题标题】:NSString caseInsensitiveCompare confusing orderingNSString caseInsensitiveCompare 混淆排序
【发布时间】:2015-06-09 03:50:05
【问题描述】:

我在使用 NSString caseInsensitiveCompare 时看到了一些连线。 对于以下两个字符串:

NSString *str1 = @"Výkazy do poisťovní";
NSString *str2 = @"Vyšlé faktúry 2007.xls";

我使用 NSString caseInsensitiveCompare 来比较它们,

    int ci1 = [str1 caseInsensitiveCompare:str2];
    int ci2 = [str2 caseInsensitiveCompare:str1];

由于它们是不同的字符串,我希望上面的代码应该给我 1 和 -1。但令人惊讶的是 ci1 和 ci2 都是 1。这怎么会发生???

【问题讨论】:

  • 你怎么知道他们都是1? NSLog 是怎么说的?
  • 我测试了它,这就是 NSLog 给我的。

标签: objective-c osx-yosemite


【解决方案1】:

当它是一个用于显示的字符串时,总是使用 current 语言环境。

NSString *str1 = @"Výkazy do poisťovní";
NSString *str2 = @"Vyšlé faktúry 2007.xls";

int ci1 = [str1 compare:str2 options:NSCaseInsensitiveSearch range:NSMakeRange(0, str1.length) locale:[NSLocale currentLocale]];
int ci2 = [str2 compare:str1 options:NSCaseInsensitiveSearch range:NSMakeRange(0, str2.length) locale:[NSLocale currentLocale]];

【讨论】:

  • 默认使用当前语言环境。
  • @rmaddy,不,不是。您要么必须使用带有语言环境参数的方法之一,要么需要使用-localizedCaseInsensitiveCompare:-caseInsensitiveCompare: 的文档甚至这么说。
  • 我的错误。默认使用的是系统语言环境,而不是当前语言环境。
【解决方案2】:

您发现了一个错误。在这种情况下,您不能使用头脑简单的caseInsensitiveCompare:。您必须手动关闭变音符号和大小写,如下所示:

NSComparisonResult ci1 = [str1 compare:str2 options:NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch range:NSMakeRange(0,str1.length)];
NSComparisonResult ci2 = [str2 compare:str1 options:NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch range:NSMakeRange(0,str2.length)];

【讨论】:

  • Plain caseInsensitiveCompare: 应该为 any 数据提供一致的结果。
  • @gnasher729 当然应该。这就是为什么,在我的回答中,我称之为错误。
  • 是的,对我来说看起来像是一个错误,除非有一些带有变音符号的超级有线排序。 NSDiacriticInsensitiveSearch 似乎确实解决了这个问题。谢谢!
  • 非常有趣的问题 - 我以前从未注意到它。您想向 Apple 提交错误报告,还是希望我这样做?
猜你喜欢
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多