6

アプリでこのコードを使用します。韓国語を比較すると、見つかったばかりは正しくありません

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

間違った結果: 2 つの韓国語の単語を異なるものとして比較

        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 はエンコードを単独で使用します。

英語はASCIIのように7バイトのみを使用します

中国語の使用 9 バイトを使用 多分 utf8

しかし、韓国語では、2 つの異なる結果が表示されます。

誰もこれを知っていますか

4

1 に答える 1

9

ここでの問題は、正規化されていない文字列を比較することです。Unicode では、文字を直接使用することも、他の文字から構成することもできます。たとえば、ドイツ語には、コードポイント「ä」または「¨」と「a」のコードポイントのシーケンスのいずれかで表すことができる文字「ä」があります。

ここで、韓国語の文字列にも同じ問題があります。出力では同じように見えますが、そのうちの 1 つは分解され (UTF-8 データ表現が長くなります)、もう 1 つはそうではありません。

この問題を回避する 1 つの方法は、以下を使用してすべての文字列を正規化すること - [NSString precomposedStringWithCanonicalMapping]です。

BOOL flag = [[lang precomposedStringWithCanonicalMapping] isEqualToString:
                    [currentLang precomposedStringWithCanonicalMapping]];
于 2012-06-19T14:49:17.957 に答える