Mysql
 sql >> Base de données >  >> RDS >> Mysql

Caractères MySQL, UTF-8 et Emoji

Le problème est de savoir si la base de données a une comparaison insensible diacritique. L'autre problème concerne les caractères composés, ï peut être exprimé sous la forme d'un caractère unicode ou de deux caractères formant une paire de substitution. Il existe des méthodes pour convertir une chaîne en une forme pré-composée ou décomposée :precomposedStringWith* et decomposedStringWith*.

Il semble que MySQL supporte deux formes d'unicode ucs2 (c'est une forme plus ancienne qui a été remplacée par utf16) qui est de 16 bits par caractère et utf8 jusqu'à 3 octets par caractère. La mauvaise nouvelle est qu'aucune des deux formes ne prendra en charge les caractères du plan 1 qui nécessitent 17 bits. (principalement des émojis). Il semble que MySQL 5.5.3 et versions ultérieures prennent également en charge utf8mb4, utf16 et utf32 prennent en charge BMP et les caractères supplémentaires (lire emoji). Voir Jeux de caractères MySQL Unicode .

Voici quelques codes et résultats pour illustrer les différentes représentations d'octets Unicode.
Unicode est un système de codage 21 bits.
UTF32 représente directement les points de code et montre clairement les paires de substitution décomposées.
UTF8 et UTF16 nécessitent un ou plusieurs octets pour représenter un caractère unicode.

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

// Pour certaines paires de substitution, il n'y a pas d'autre forme

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

Sortie 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>