2012-06-19 18 views
5

tôi sử dụng mã này trong ứng dụng của mình. vừa tìm thấy là không đúng khi so sánh Hàn QuốcNSString isEqualToString: không hoạt động

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

kết quả sai: hai từ Hàn Quốc so như khác nhau

 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> 

đúng một:

 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> 

có vẻ như rằng: NSString sử dụng mã hóa bởi chính nó,

tiếng Anh chỉ sử dụng 7 byte như ascii

Trung Quốc sử dụng sử dụng 9 byte có lẽ utf8

nhưng bằng tiếng Hàn, nó xuất hiện hai kết quả khác nhau,

không ai biết điều này

+0

Liệu -lang trả về một NSString? Nếu không, thì chúng sẽ không bao giờ bằng nhau. Có lẽ bạn nên bỏ cả hai vào MLLanguage và thử sử dụng toán tử isEqual :. –

+0

là đối tượng NSString, bạn có thể xem nhật ký, chỉ có tiếng Hàn là không chính xác –

+0

'한국어' isEqual to '한국어', 0 . đối tượng lang là dòng đầu tiên. có lẽ đối tượng lang không phải là utf8 NSString –

Trả lời

8

Vấn đề ở đây là bạn so sánh chuỗi không bình thường. Trong Unicode, bạn có thể sử dụng ký tự trực tiếp hoặc soạn chúng từ các ký tự khác. Ví dụ trong tiếng Đức, có ký tự "ä" có thể được biểu diễn bằng điểm "ä" hoặc chuỗi mã cho "¨" và "a".

Bạn gặp vấn đề tương tự ở đây với chuỗi tiếng Hàn: Trong khi chúng trông giống nhau ở đầu ra, một trong số chúng bị phân hủy (dẫn đến biểu diễn dữ liệu UTF-8 dài hơn).

Một cách để làm việc xung quanh vấn đề này là để bình thường hóa tất cả các chuỗi bằng cách sử dụng - [NSString precomposedStringWithCanonicalMapping]:

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

thx bạn là chuyên gia –

+2

Phương thức 'so sánh 'của NSString cũng sẽ hoạt động: BOOL flag = ([lang compare: currentLang) == 0). – arlomedia