MySQL的,UTF-8和绘文字字符(MySQL, UTF-8 and Emoji characte

2019-10-20 07:21发布

我工作的一个PHP + MySQL后端的iOS应用。 该应用程序有一个聊天部分,这需要支持表情符号。 我的表是utf8_unicode_ci。 如果我没有在我的剧本叫“设置名称UTF8”,表情符号它的实际工作 - 无论是在数据库中输入,则返回到客户端,因为它应该。

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

但是,如果我做调用设置名称UTF8,突然表情符号字符插入为一堆questionmarks的。

在处理这个正确的方法有什么建议? 谢谢!

Answer 1:

问题是羯羊分贝具有变音不敏感的比较。 另一个问题是由字符,I可以表示为任一个Unicode字符或两个成形代理对。 有方法将字符串转换为预组合或分解形式:precomposedStringWith *和* decomposedStringWith。

这似乎是,MySQL支持Unicode UCS2的两种形式(即,是由UTF16取代旧的形式),其是每字符和UTF8高达每字符的3个字节的16位。 坏消息是,无论形式是要支持平面1个字符,这需要在17位。 (主要是表情符号)。 它看起来像MySQL 5.5.3及以上还支持utf8mb4,UTF16和UTF32支持BMP和增补字符(读的表情符号)。 见MySQL的Unicode字符集 。

下面是一些代码和结果证明了不同的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: %@", @"