MySQL、UTF-8和Emoji字符 [英] MySQL, UTF-8 and Emoji characters

查看:0
本文介绍了MySQL、UTF-8和Emoji字符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个带有PHP+MySQL后端的iOS应用程序。这款应用有一个聊天部分,需要支持表情符号。 我的表是utf8_unicode_ci。如果我没有在我的脚本中调用‘set Names UTF8’,它实际上起作用的表情符号--无论在数据库中输入什么,都会像应该的那样返回给客户端。

问题是,这(如果我理解正确的话)在数据库中错误地存储了特殊字符,这破坏了字符串比较(即,在比较字符串时不再与I相同)。

然而,如果我真的调用集合名称UTF8,表情符号字符突然被插入为一堆问号。

有没有关于正确处理这一问题的建议?谢谢!

推荐答案

问题是数据库是否具有变音不敏感比较。另一个问题是组成字符,可以表示为一个Unicode字符或两个组成代理项对的Unicode字符。有几种方法可以将字符串转换为预先合成或分解的形式:preComposedStringWith*和DisplposedStringWith*。

MySQL似乎支持两种形式的Unicode ucs2(即被utf16取代的旧形式),即每个字符16位和UTF8,每个字符最多3个字节。坏消息是,这两种形式都不支持需要至少17位的第一层面字符。(主要是表情符号)。看起来MySQL5.5.3和更高版本也支持utf8mb4、utf16和utf32支持BMP和补充字符(阅读emoji)。请参阅MySQL Unicode Character Sets

以下是演示不同Unicode字节表示形式的一些代码和结果。
Unicode是21位编码系统。
UTF32直接表示代码点,并清楚地演示已分解的代理项对。
UTF8和UTF16需要一个或多个字节来表示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]);

//对于某些代理对,没有其他形式

NSString *aReverse = [[NSString alloc] initWithBytes:"xD8x3CxDDx70x00" 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>

这篇关于MySQL、UTF-8和Emoji字符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆