IOS輸入的emoji mysql儲存不了(線上不能改utf8mb4),如何判斷輸入的字元含有emoji,然後提示
回複內容:
IOS輸入的emoji mysql儲存不了(線上不能改utf8mb4),如何判斷輸入的字元含有emoji,然後提示
不用判斷是否是emoji,傳輸過來的用json_encode加密之後存入資料庫,然後取出的時候用json_decode一下顯示出來就可以了,json_decode之前也可以urlencode一下,取出的時候urldecode一下;
存入資料庫之前
$message = json_encode($message);
取出之後
$message = json_decode($message)
code:
$regex = '/([0-9|#][\x{20E3}])|[\x{00ae}|\x{00a9}|\x{203C}|\x{2047}|\x{2048}|\x{2049}|\x{3030}|\x{303D}|\x{2139}|\x{2122}|\x{3297}|\x{3299}][\x{FE00}-\x{FEFF}]?|[\x{2190}-\x{21FF}][\x{FE00}-\x{FEFF}]?|[\x{2300}-\x{23FF}][\x{FE00}-\x{FEFF}]?|[\x{2460}-\x{24FF}][\x{FE00}-\x{FEFF}]?|[\x{25A0}-\x{25FF}][\x{FE00}-\x{FEFF}]?|[\x{2600}-\x{27BF}][\x{FE00}-\x{FEFF}]?|[\x{2900}-\x{297F}][\x{FE00}-\x{FEFF}]?|[\x{2B00}-\x{2BF0}][\x{FE00}-\x{FEFF}]?|[\x{1F000}-\x{1F6FF}][\x{FE00}-\x{FEFF}]?/u';var_dump(preg_match($regex, '?'));var_dump(preg_match($regex, '?'));var_dump(preg_match($regex, '?'));var_dump(preg_match($regex, '測試'));var_dump(preg_match($regex, 'hello, world'));var_dump(preg_match($regex, 'testing'));var_dump(preg_match($regex, '中文 English'));
result:
int(1)int(1)int(1)int(0)int(0)int(0)int(0)
運算式是找來的,可以去看下utf8的碼錶中emoji的範圍(或者從unicode碼錶範圍轉utf8)
不過建議還是改utf8mb4,這種遷移基本是無痛的,充分測試下即可
根本解決辦法是資料庫支援emoji
你確定不把emoji存入資料庫,而是檢測到然後提示?
檢測
//返回true就表示有emojifunction testEmoji($str){ $text = json_encode($str); //暴露出unicode return preg_match("/(\\\u[ed][0-9a-f]{3})/i",$text);}
轉義並存入資料庫
看我以前的問題吧 http://segmentfault.com/q/1010000003711491