2012-06-19 5 views
5

io uso questo codice nella mia app. appena trovato non è corretto quando si confronta coreanoNSString isEqualToString: non funziona

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

risultato sbagliato: i due parola coreana paragonata come diversi

 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> 

corretto:

 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> 

sembra che: NSString uso codificare da stesso,

inglese usa solo 7 byte come ascii

cinese uso uso 9 byte forse utf8

ma in coreano, apparire due risultati diversi,

qualcuno sa questo

+0

Does -lang restituire un NSString? Se no, allora non saranno mai uguali. Forse dovresti inserire entrambi in MLLanguage e provare a utilizzare l'operatore isEqual :. –

+0

si tratta di un oggetto NSString, è possibile vedere il registro, unico coreano non è corretto –

+0

'한국어' IsEqual a '한국어', 0 . l'oggetto lang è la prima riga. forse l'oggetto lang non è un utf8 NSString –

risposta

8

Il problema qui è che si confrontano stringhe non normalizzati. In Unicode, puoi utilizzare i caratteri direttamente o comporli da altri caratteri. Per esempio in tedesco, c'è il carattere "ä" che può essere rappresentato dal punto di codice "ä" o dalla sequenza di punti di codice per "¨" e "a".

Qui si ha lo stesso problema con le stringhe coreane: mentre hanno l'aspetto identico nell'output, uno di questi è scomposto (che porta alla rappresentazione dei dati UTF-8 più lunga) mentre l'altro non lo è.

Un modo per ovviare a questo problema è di normalizzare tutte le stringhe utilizzando - [NSString precomposedStringWithCanonicalMapping]:

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

thx sei esperto –

+2

Il metodo 'compare' di NSString dovrebbe funzionare anche: BOOL flag = ([lang compare: currentLang) == 0). – arlomedia