周末 群里提了一个问题 提示我的接口报错,提示的用户名有问题,这个是内部使用的按理来说不应该出现这个问题,我和我同事就怀疑是不是编码问题
然后我这边输出他给我传的信息 发现用户名是汉字的时候 我获取是???占位符
页面设置 header("Content-type:text/html;charset=utf-8");
然后就我这边打印参数编码
检测当前编码: $encode = mb_detect_encoding($operatereason, array("ASCII", "UTF-8", "GB2312", "GBK", "BIG5"));
查看发现 他给我传的是 EUC-CN
这里看一下 EUC-CN
EUC-CN是gb2312编码的一种表示方法。
然后我俩讨论编码的问题
然后他那边中文最后是给我传了一个Unicode编码
然后我这边 转一下
$name = preg_replace_callback("#\\\u([0-9a-f]{4})#i", function($matches){ return iconv('UCS-2BE', 'UTF-8', pack('H4', $matches[1])); }, $name);
这个时候 显示的就是中文了
附录1
php转换字符编码为utf-8
string iconv ( string incharset,stringincharset,stringout_charset , string $str )
将字符串 str 从 in_charset 转换编码到 out_charset。
function strToUtf8($str){
$encode = mb_detect_encoding($str, array("ASCII",'UTF-8',"GB2312","GBK",'BIG5'));
if($encode == 'UTF-8'){
return $str;
}else{
return mb_convert_encoding($str, 'UTF-8', $encode);
}
}
附录2
PHP json_decode中文转义的问题
默认情况下PHP的 json_decode 方法会把特殊字符进行转义,还会把中文转为Unicode编码形式。在有些情况下不希望进行这种转义。
对于PHP5.4+版本,json_decode函数第二个参数,可以用来限制转义范围。要限制中文,使用JSON_UNESCAPED_UNICODE参数。
json_encode($a, JSON_UNESCAPED_UNICODE);
对于PHP5.3及以前版本,可以用如下方式转回中文:
$originstr = '{"name":"张三"}';
$jsonobject = json_decode($originstr);
// badstr: {"name":"\u5f20\u4e09"}
$badstr = json_encode($jsonobject);
// goodstr: {"name":"张三"}
$goodstr = preg_replace_callback("#\\\u([0-9a-f]{4})#i", function($matches){
return iconv('UCS-2', 'UTF-8', pack('H4', $matches[1]));
}, $badstr);
附录3
json_encode、json_decode的中文乱码问题?
https://blog.csdn.net/changfangyuansh/article/details/100564351