2012-06-19 22 views
5

Używam tego kodu w mojej aplikacji. Właśnie znalazłem nie jest prawidłowa, gdy porównać koreańskiNSString isEqualToString: nie działa

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

zły wynik: dwa koreańskie słowo porównaniu tak różne

 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> 

prawidłowa:

 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> 

wydaje się, że: NSString użycia kodowania przez sam,

angielski używać tylko 7 bajt jak ascii

chinese wykorzystanie wykorzystanie 9 bajt może utf8

ale w koreańskim, to pojawiają się dwa różne wyniki,

czy ktoś wie to

+0

Czy -lang powrócić NSString? Jeśli nie, to nigdy nie będą równe. Może powinieneś rzucić oba na MLLanguage i spróbować użyć operatora isEqual :. –

+0

to obiekt NSString można zobaczyć dziennik, tylko koreański jest nieprawidłowy –

+0

'한국어' IsEqual do '한국어', 0 . obiekt języka jest pierwszą linią. może obiekt lang nie jest utf8 NSString –

Odpowiedz

8

Problem polega na tym, że jeśli porównać nieznormalizowaną sznurki. W Unicode możesz albo używać znaków bezpośrednio, albo komponować je z innymi postaciami. Na przykład w języku niemieckim istnieje znak "ä", który może być reprezentowany przez punkt kodowy "ä" lub sekwencję punktów kodowych dla "¨" i "a".

Ten sam problem występuje w przypadku koreańskich ciągów znaków: podczas gdy wyglądają tak samo na wyjściu, jeden z nich jest rozłożony (co prowadzi do dłuższej reprezentacji danych UTF-8), podczas gdy drugi nie jest.

Jednym ze sposobów obejścia tego problemu jest znormalizować wszystkie ciągi przy użyciu - [NSString precomposedStringWithCanonicalMapping]:

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

thx jesteś ekspertem –

+2

Metoda 'compare' NSString powinna również działać: BOOL flag = ([lang porównaj: currentLang) == 0). – arlomedia