phpjsonemoji问号,json_encode转码emoji等特殊表情报错json_encode转码emoji等特殊表情报错
进⾏实验⼀:json_encode($data,JSON_UNESCAPED_UNICODE);
$emoji=" ";
phpjson格式化输出$data=[
'post'=>"很好,爷的⽹抑云歌单新增12⾸VIP单曲".$emoji,
];
//⽤这个就会有问题!
echo "\n";
echo "---------json_encode数据------------";
echo "\n";
echo "\n";
$jsondata=json_encode($data,JSON_UNESCAPED_UNICODE);
echo $jsondata;
echo "\n";
echo "\n";
echo "---------json_decode数据------------";
echo "\n";
var_export(json_decode($jsondata,1));
echo "\n";
echo "\n";
终端输出
看到终端输出的,发现json_encode的json数据格式出错了,少了个括号,第⼆个问题,json_decode后数组post后⾯少了引号和逗号!
其实这些只是终端渲染表现的问题!json编码和解码都没有问题的,我们把终端输出的数据直接复制到txt⽂本中可以看下是这样的表现!
我们可以发现其实数据json后是没有任何问题
进⾏实验⼆:json_encode($data);
因为⼀开始我们看终端⾛了弯路,以为是json策略的问题,所以⽤了这个⽅式发现终端是正常的显⽰的,其实实验⼀也是正常的.
$emoji=" ";
$data=[
'post'=>"很好,爷的⽹抑云歌单新增12⾸VIP单曲".$emoji,
];
/
/⽤这个就会有问题!
echo "\n";
echo "---------json_encode数据------------";
echo "\n";
echo "\n";
$jsondata=json_encode($data);
echo $jsondata;
echo "\n";
echo "\n";
echo "---------json_decode数据------------";
echo "\n";
var_export(json_decode($jsondata,1));
echo "\n";
echo "\n";
---------json_encode数据------------
{"post":"\u5f88\u597d\uff0c\u7237\u7684\u7f51\u6291\u4e91\u6b4c\u5355\u65b0\u589e12\u9996VIP\u5355\u66f
---------json_decode数据------------
array (
'post' => '很好,爷的⽹抑云歌单新增12⾸VIP单曲 ',
)
那么问题来了
如果把实验⼀:json_encode($data,JSON_UNESCAPED_UNICODE);的数据插⼊数据库,因为我们数据关闭了错误⽀持强插⼊数据,所以不
会报下⾯这个错误:
General error: 1366 Incorrect string value: '\xF0\x9F\x98\x83\' for column 'content' at row 1
最终我们把数据成功插⼊之后,数据查询出来的数据是长这样
id : 656
extra :
{"post":"很好,爷的⽹抑云歌单新增12⾸VIP单曲
数据库json被破坏了,彻底截断了,把数据进⾏json反解,都解不出来了.
但是当我们使⽤实验⼆:json_encode($data); 进⾏插⼊数据库的时候,却发现没有这个问题
id : 656
extra :
{"post":"\u5f88\u597d\uff0c\u7237\u7684\u7f51\u6291\u4e91\u6b4c\u5355\u65b0\u589e12\u9996VIP\u5355\u66f2\ud
到问题根源,数据库存储编码问题
因为我们使⽤低版本的数据库不⽀持utf8mb4,所以4字节的emoji表情存储不进去,⽽使⽤json_encode($data);会将emoji进⾏Unicode编
码,杜绝了这个问题
最后科普⼀下
⾸先说⼀下utf8和utf8mb4:
UTF-8: Unicode Transformation Format-8bit,允许含BOM,但通常不含BOM. 是⼀种解决国际字符串的⼀种多字节编码,对英⽂使⽤
8bit(⼀个字节)
中⽂使⽤24bit(三个字节)来进⾏编码。UTF-8包含所有国家需要⽤到的字符,是国际编码,并且UTF-8
编码的⽂字可以在各国⽀持UTF-8
字符集的浏览器上显⽰,
如果⽂字使⽤UTF-8编码,那么外国⼈的英⽂IE上也能显⽰中⽂,⽆需下载IE中⽂包。
UTF8MB4: Mysql在5.53版本之后增加了utf8mb4编码, mb4即most bytes 4,专门⽤来兼容四个字节即以上的unicode
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论