我工作的一个PHP + MySQL后端的iOS应用。 该应用程序有一个聊天部分,这需要支持表情符号。 我的表是utf8_unicode_ci。 如果我没有在我的剧本叫“设置名称UTF8”,表情符号它的实际工作 - 无论是在数据库中输入,则返回到客户端,因为它应该。
问题是,这(如果我理解正确的话)不正确地存储特殊字符在数据库中,这打破了字符串比较(即我不再同我比较字符串时)。
但是,如果我做调用设置名称UTF8,突然表情符号字符插入为一堆questionmarks的。
在处理这个正确的方法有什么建议? 谢谢!
问题是羯羊分贝具有变音不敏感的比较。 另一个问题是由字符,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: %@", @"