这个鬼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;