NSString caseInsensitiveCompare令人困惑的排序

时间:2015-06-08 18:15:56

标签: objective-c osx-yosemite

我在使用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.这怎么可能发生?

2 个答案:

答案 0 :(得分: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]];

答案 1 :(得分:0)

您发现了一个错误。在这种情况下,您无法使用头脑简单的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)];