这个鬼emoji表情是4个字节,mysql使用的utf8编码,UTF8占3个字节,要存储那个emoji表情需要将mysql编码由UFT8改为UFT8的超集,utf8mb4;
改数据库编码容易引起大面的乱码灾难。所以当遇到emoji字符表情的时候做特殊处理。网上也有很多处理方案,最后找到了一个贴上地址和代码:https://github.com/BriquzStudio/php-emoji ,多谢
class Emoji
{
/**
* Encode emoji in text
* @param string $text text to encode
*/
public static function Encode($text) {
return self::convertEmoji($text,"ENCODE");
}
/**
* Decode emoji in text
* @param string $text text to decode
*/
public static function Decode($text) {
return self::convertEmoji($text,"DECODE");
}
private static function convertEmoji($text,$op) {
if($op=="ENCODE"){
return preg_replace_callback('/([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{2600}-x{27BF}][x{1F000}-x{1FEFF}]?|[x{2900}-x{297F}][x{FE00}-x{FEFF}]?|[x{2B00}-x{2BF0}][x{FE00}-x{FEFF}]?|[x{1F000}-x{1F9FF}][x{FE00}-x{FEFF}]?|[x{1F000}-x{1F9FF}][x{1F000}-x{1FEFF}]?/u',array('self',"encodeEmoji"),$text);
}else{
return preg_replace_callback('/(\u[0-9a-f]{4})+/',array('self',"decodeEmoji"),$text);
}
}
private static function encodeEmoji($match) {
return str_replace(array('[',']','"'),'',json_encode($match));
}
private static function decodeEmoji($text) {
if(!$text) return '';
$text = $text[0];
$decode = json_decode($text,true);
if($decode) return $decode;
$text = '["' . $text . '"]';
$decode = json_decode($text);
if(count($decode) == 1){
return $decode[0];
}
return $text;
}
}
$nickName = Emoji::Decode($userinfo['nickname']);
$realName = empty($nickName) ? '微信用户:' . time() : $nickName;