Objective c NSString大小写不敏感比较混乱排序

Objective c NSString大小写不敏感比较混乱排序,objective-c,osx-yosemite,Objective C,Osx Yosemite,在使用NSString caseInsensitiveCompare时,我看到一些连线。 对于以下两个字符串: NSString *str1 = @"Výkazy do poisťovní"; NSString *str2 = @"Vyšlé faktúry 2007.xls"; 我使用NSString CASENSENSITIVECOMPARE比较它们 int ci1 = [str1 caseInsensitiveCompare:str2]; int ci2 = [str2

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

NSString *str1 = @"Výkazy do poisťovní";
NSString *str2 = @"Vyšlé faktúry 2007.xls";
我使用NSString CASENSENSITIVECOMPARE比较它们

    int ci1 = [str1 caseInsensitiveCompare:str2];
    int ci2 = [str2 caseInsensitiveCompare:str1];
因为它们是不同的字符串,我希望上面的代码应该给我1和-1。但令人惊讶的是,ci1和ci2都是1。这是怎么发生的呢?

如果是用于显示的字符串,请始终使用当前区域设置

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]];

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

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)];

默认情况下使用当前区域设置。@rmaddy,不,不是。您必须使用其中一种方法来获取区域设置参数,或者需要使用
-localizedcaseinsensitiviecompare:
-caseInsensitiveCompare:
的文档甚至这么说。我错了。默认情况下使用的是系统区域设置,而不是当前区域设置。您如何知道它们都是1?NSLog说什么?我测试过它,这就是NSLog给我的。简单的不区分大小写比较:应该对任何数据给出一致的结果。@gnasher729当然应该。这就是为什么,在我的回答中,我称之为bug。是的,对我来说看起来像bug,除非有一些带变音符号的超链接排序。NSDiacriticInsensitiveSearch似乎解决了这个问题。谢谢非常有趣的问题-我以前从未注意到。你是想向苹果公司提交一份bug报告,还是想让我来做?