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位的第一層面字符。(主要是表情符號)??雌饋鞰ySQL5.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天全站免登陸
全免费A级毛片免费看无码播放