2012-06-19 15 views
5

काम नहीं करता है, मैं अपने ऐप में इस कोड का उपयोग करता हूं। बस पाया सही नहीं है जब कोरियाई तुलनाएनएसएसटींग 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

-lang एक NSString वापसी करता है? यदि नहीं, तो वे कभी बराबर नहीं होंगे। हो सकता है कि आपको दोनों को एमएल भाषा में डालना चाहिए और isEqual: ऑपरेटर का उपयोग करने का प्रयास करें। –

+0

यह एक NSString वस्तु है, तो आप लॉग देख सकते हैं, केवल कोरियाई गलत –

+0

'한국어' isEqual है करने के लिए '한국어', 0 । लैंग ऑब्जेक्ट पहली पंक्ति है। हो सकता है कि लैंग ऑब्जेक्ट एक utf8 nSString –

उत्तर

8

समस्या यहाँ है कि आप गैर सामान्यीकृत तार की तुलना है। यूनिकोड में, आप या तो सीधे वर्णों का उपयोग कर सकते हैं, या उन्हें अन्य पात्रों से लिख सकते हैं। उदाहरण के लिए जर्मन में, चरित्र "ä" है जिसे या तो कोडपॉइंट "ä" या "¨" और "ए" के लिए कोड बिंदुओं के अनुक्रम द्वारा दर्शाया जा सकता है।

आप कोरियाई तार के साथ यहाँ एक ही समस्या है: एक ओर जहां वे उत्पादन में एक ही लग रहे हैं, उनमें से एक विघटित किया जाता है (जो अब UTF-8 डेटा प्रतिनिधित्व की ओर जाता है), जबकि अन्य नहीं है।

एक तरह से इस समस्या को हल करने के लिए - [NSString precomposedStringWithCanonicalMapping] का उपयोग कर अपने सभी स्ट्रिंग्स को सामान्य करने के लिए है:

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

thx नहीं है, आप विशेषज्ञ हैं –

+2

एनएसएसटींग की 'तुलना' विधि भी काम करनी चाहिए: BOOL flag = ([lang तुलना: currentLang) == 0)। – arlomedia