Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-, UTF-8- und Emoji-Zeichen

Das Problem ist, ob die DB einen diakritischen unsensiblen Vergleich hat. Das andere Problem sind zusammengesetzte Zeichen. ï kann entweder als ein Unicode-Zeichen oder als zwei Zeichen ausgedrückt werden, die ein Ersatzzeichenpaar bilden. Es gibt Methoden, um einen String in eine vorkomponierte oder zerlegte Form umzuwandeln:precomposedStringWith* und decomposedStringWith*.

Es scheint, dass MySQL zwei Formen von Unicode ucs2 unterstützt (das ist eine ältere Form, die durch utf16 ersetzt wurde), nämlich 16 Bit pro Zeichen und utf8 bis zu 3 Byte pro Zeichen. Die schlechte Nachricht ist, dass keines der Formulare Zeichen der Ebene 1 unterstützt, die 17 Bit benötigen. (hauptsächlich Emojis). Es sieht so aus, als ob MySQL 5.5.3 und höher auch utf8mb4, utf16 und utf32 unterstützen BMP und ergänzende Zeichen (lesen Sie Emoji). Siehe MySQL-Unicode-Zeichensätze .

Hier sind einige Codes und Ergebnisse, um die unterschiedlichen Unicode-Bytedarstellungen zu demonstrieren.
Unicode ist ein 21-Bit-Codierungssystem.
UTF32 stellt die Codepunkte direkt dar und demonstriert deutlich zerlegte Ersatzpaare.
UTF8 und UTF16 erfordern ein oder mehrere Bytes, um ein Unicode-Zeichen darzustellen.

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

// Für einige Ersatzpaare gibt es keine andere Form

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-Ausgabe:

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>