的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
但在韩国,它出现两种不同的结果,
没有人知道这个
的这里的问题是,你比较非规范化的字符串。在Unicode中,您可以直接使用字符,也可以使用其他字符组成字符。例如,在德国,有字符“A”,它可以由码点“A”或代码点“¨”和“a”的序列来表示的任一。
您在这里有同样的问题与韩国的字符串:虽然他们看起来是一样的输出,其中一人被分解(这会导致较长的UTF-8的数据表示),而另一个则不是。要解决此问题
一种方法是使用 - [NSString precomposedStringWithCanonicalMapping]
正常化您的所有字符串:
BOOL flag = [[lang precomposedStringWithCanonicalMapping] isEqualToString:
[currentLang precomposedStringWithCanonicalMapping]];
THX你是专家 –
的NSString的'compare'方法也应该工作:BOOL标志=([郎咸平比较:currentLang)== 0)。 – arlomedia
是否琅返回一个NSString?如果不是,那么他们永远不会平等。也许你应该投两成MLLanguage并尝试使用isEqual:方法操作。 –
这是一个NSString的对象,你可以看到日志,只有韩国是不正确 –
'한국어' 来的isEqual '한국어',0。 lang对象是第一行。也许郎对象不是UTF8的NSString –