問題は、dbに発音区別符号のない比較があるかどうかです。もう1つの問題は合成文字です。これは、1つのUnicode文字または2つのサロゲートペアを形成する文字として表現できます。文字列を事前に作成された形式または分解された形式に変換するメソッドがあります:precomposedStringWith*およびdecomposedStringWith*。
MySQLは、1文字あたり16ビットと1文字あたり最大3バイトのutf8である2つの形式のUnicode ucs2(utf16に取って代わられた古い形式)をサポートしているようです。悪いニュースは、どちらの形式も17ビットを必要とするプレーン1の文字をサポートしないということです。 (主に絵文字)。 MySQL 5.5.3以降は、utf8mb4、utf16、およびutf32もBMPと補助文字をサポートしているようです(絵文字を読んでください)。 MySQLUnicode文字セット を参照してください。 。
さまざまなUnicodeバイト表現を示すためのコードと結果を次に示します。
Unicodeは21ビットのエンコーディングシステムです。
UTF32はコードポイントを直接表し、分解された代理ペアを明確に示します。
UTF8とUTF16 Unicode文字を表すには1バイト以上が必要です。
NSLog(@"character: %@", @"Å");
NSLog(@"decomposedStringWithCanonicalMapping UTF8: %@", [[@"Å" decomposedStringWithCanonicalMapping] dataUsingEncoding:NSUTF8StringEncoding]);
NSLog(@"decomposedStringWithCanonicalMapping UTF16: %@", [[@"Å" decomposedStringWithCanonicalMapping] dataUsingEncoding:NSUTF16BigEndianStringEncoding]);
NSLog(@"decomposedStringWithCanonicalMapping UTF32: %@", [[@"Å" decomposedStringWithCanonicalMapping] dataUsingEncoding:NSUTF32BigEndianStringEncoding]);
NSLog(@"precomposedStringWithCanonicalMapping UTF8: %@", [[@"Å" precomposedStringWithCanonicalMapping] dataUsingEncoding:NSUTF8StringEncoding]);
NSLog(@"precomposedStringWithCanonicalMapping UTF16: %@", [[@"Å" precomposedStringWithCanonicalMapping] dataUsingEncoding:NSUTF16BigEndianStringEncoding]);
NSLog(@"precomposedStringWithCanonicalMapping UTF32: %@", [[@"Å" precomposedStringWithCanonicalMapping] dataUsingEncoding:NSUTF32BigEndianStringEncoding]);
NSLog(@"character: %@", @"😱");
NSLog(@"dataUsingEncoding UTF8: %@", [@"😱" dataUsingEncoding:NSUTF8StringEncoding]);
NSLog(@"dataUsingEncoding UTF16: %@", [@"😱" dataUsingEncoding:NSUTF16BigEndianStringEncoding]);
NSLog(@"dataUsingEncoding UTF32: %@", [@"😱" dataUsingEncoding:NSUTF32BigEndianStringEncoding]);
//一部のサロゲートペアには他の形式はありません
NSString *aReverse = [[NSString alloc] initWithBytes:"\xD8\x3C\xDD\x70\x00" length:4 encoding:NSUTF16BigEndianStringEncoding];
NSLog(@"character: %@", aReverse);
NSLog(@"dataUsingEncoding UTF8: %@", [aReverse dataUsingEncoding:NSUTF8StringEncoding]);
NSLog(@"dataUsingEncoding UTF16: %@", [aReverse dataUsingEncoding:NSUTF16BigEndianStringEncoding]);
NSLog(@"dataUsingEncoding UTF32: %@", [aReverse dataUsingEncoding:NSUTF32BigEndianStringEncoding]);
NSLog出力:
character: Å
decomposedStringWithCanonicalMapping UTF8: <41cc8a>
decomposedStringWithCanonicalMapping UTF16: <0041030a>
decomposedStringWithCanonicalMapping UTF32: <00000041 0000030a>
precomposedStringWithCanonicalMapping UTF8: <c385>
precomposedStringWithCanonicalMapping UTF16: <00c5>
precomposedStringWithCanonicalMapping UTF32: <000000c5>
character: 😱
dataUsingEncoding UTF8: <f09f98b1>
dataUsingEncoding UTF16: <d83dde31>
dataUsingEncoding UTF32: <0001f631>
character: 🅰
dataUsingEncoding UTF8: <f09f85b0>
dataUsingEncoding UTF16: <d83cdd70>
dataUsingEncoding UTF32: <0001f170>