的NSString isEqualToString:不工作

问题描述:

我在我的应用程序使用此代码。刚刚发现是不正确的时候比较韩国的NSString isEqualToString:不工作

 for (NSString *lang in array){ 
     NSString *currentLang = [[MLLanguage sharedInstance] lang]; 
     BOOL flag = [lang isEqualToString:currentLang]; 
     NSLog(@"\n'%@' isEqual to '%@', %d\n%@\n%@", lang, currentLang, flag?1:0, [lang dataUsingEncoding:NSUTF8StringEncoding], [currentLang dataUsingEncoding:NSUTF8StringEncoding]); 

错误的结果:两个韩字相比不同

 2012-06-19 21:16:52.681 Motilink[10188:11903] -[MLSettingLanguageViewController    loadDownloadedData][Line 50] 
     'English' isEqual to '한국어', 0 
     <456e676c 697368> 
     <ed959cea b5adec96 b4> 
     2012-06-19 21:16:52.682 Motilink[10188:11903] -[MLSettingLanguageViewController    loadDownloadedData][Line 50] 
     '한국어' isEqual to '한국어', 0 
     <e18492e1 85a1e186 abe18480 e185aee1 86a8e184 8be185a5> 
     <ed959cea b5adec96 b4> 
     2012-06-19 21:16:52.682 Motilink[10188:11903] -[MLSettingLanguageViewController    loadDownloadedData][Line 50] 
     '中国语' isEqual to '한국어', 0 
     <e4b8ade5 9bbde8af ad> 
     <ed959cea b5adec96 b4> 

正确的:

 2012-06-19 21:35:00.908 Motilink[10188:11903] -[MLSettingLanguageViewController loadDownloadedData][Line 50] 
     'English' isEqual to '中国语', 0 
     <456e676c 697368> 
     <e4b8ade5 9bbde8af ad> 
     2012-06-19 21:35:00.909 Motilink[10188:11903] -[MLSettingLanguageViewController    loadDownloadedData][Line 50] 
     '한국어' isEqual to '中国语', 0 
     <e18492e1 85a1e186 abe18480 e185aee1 86a8e184 8be185a5> 
     <e4b8ade5 9bbde8af ad> 
     2012-06-19 21:35:00.909 Motilink[10188:11903] -[MLSettingLanguageViewController loadDownloadedData][Line 50] 
     '中国语' isEqual to '中国语', 1 
     <e4b8ade5 9bbde8af ad> 
     <e4b8ade5 9bbde8af ad> 

似乎是:通过的NSString使用编码本身,

英语只用7个字节像ASCII

中国利用使用9字节也许UTF8

但在韩国,它出现两种不同的结果,

没有人知道这个

+0

是否琅返回一个NSString?如果不是,那么他们永远不会平等。也许你应该投两成MLLanguage并尝试使用isEqual:方法操作。 –

+0

这是一个NSString的对象,你可以看到日志,只有韩国是不正确 –

+0

'한국어' 来的isEqual '한국어',0 。 lang对象是第一行。也许郎对象不是UTF8的NSString –

的这里的问题是,你比较非规范化的字符串。在Unicode中,您可以直接使用字符,也可以使用其他字符组成字符。例如,在德国,有字符“A”,它可以由码点“A”或代码点“¨”和“a”的序列来表示的任一。

您在这里有同样的问题与韩国的字符串:虽然他们看起来是一样的输出,其中一人被分解(这会导致较长的UTF-8的数据表示),而另一个则不是。要解决此问题

一种方法是使用 - [NSString precomposedStringWithCanonicalMapping]正常化您的所有字符串:

BOOL flag = [[lang precomposedStringWithCanonicalMapping] isEqualToString: 
        [currentLang precomposedStringWithCanonicalMapping]]; 
+0

THX你是专家 –

+2

的NSString的'compare'方法也应该工作:BOOL标志=([郎咸平比较:currentLang)== 0)。 – arlomedia