2012-06-19 7 views
5

uso este código en mi aplicación. acaba de encontrar que no sea correcto al comparar coreanoNSString isEqualToString: no funciona

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

resultado erróneo: los dos palabra coreana comparación tan diferentes

 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> 

correcta:

 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> 

parece que: NSString uso de codificación por en sí,

inglés solo usar 7 bytes como ascii

chino uso Uso 9 bytes quizá utf8

pero en coreano, que aparece dos resultados diferentes,

¿alguien sabe este

+0

¿El -lang devolver un NSString? Si no, entonces nunca serán iguales. Tal vez deberías incluir ambos en MLLanguage e intentar usar el operador isEqual: –

+0

es un objeto NSString, se puede ver el registro, sólo el coreano es incorrecto –

+0

'한국어' IsEqual a '한국어', 0 . el objeto lang es la primera línea. tal vez el objeto lang no es utf8 NSString –

Respuesta

8

El problema aquí es que se comparan las cadenas no normalizados. En Unicode, puede usar caracteres directamente o componerlos a partir de otros caracteres. Por ejemplo, en alemán, está el carácter "ä" que puede representarse mediante el punto de código "ä" o la secuencia de puntos de código para "¨" y "a".

Tiene el mismo problema aquí con las cadenas coreanas: aunque tienen el mismo aspecto en la salida, una de ellas se descompone (lo que lleva a una representación de datos UTF-8 más larga) mientras que la otra no.

Una forma de solucionar este problema es la normalización de todas sus cadenas usando - [NSString precomposedStringWithCanonicalMapping]:

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

thx usted es experto –

+2

El método 'compare' de NSString también debería funcionar: BOOL flag = ([lang compare: currentLang) == 0). – arlomedia