您的位置:首页 > 编程语言 > PHP开发

php json_encode 中文乱码解决方法

2016-11-07 18:03 741 查看
之前,项目中就碰到了json_encode()中文编码点问题,我当时就搜了些资料,写了博客,写了一个php版本兼容的函数:

 


php的json_encode()中文编码问题

当时,只是找到了答案,并未详细看。

今天一个同事,又问起我这个函数里面的各种细节,我就仔细看了下:

preg_replace(
"#\\\u([0-9a-f]{4})#ie"
"iconv('UCS-2BE',
'UTF-8', pack('H4', '\\1'))"
,
json_encode(
$arr
))


1.最外层的 preg_replace(),替换函数。

json_decode()中文字符,默认是 '\uxxxx',转成了unicode编码。这里就是匹配 \uxxxx,替换为 iconv()执行后的结果

2.开始看下 iconv(),编码转换函数。

将pack()返回的结果,从编码 'UCS-2BE' 转变为 'UTF-8'。说明pack()返回的字符串就是 'UCS-2BE' 编码格式。

3.分析最内层的 pack(),根据给定的参数格式,将传入的数据变量,转换为binary(二进制)字符串。

手册中的pack(string 
$format
 [, mixed 
$args
 [, mixed 
$...
 ]])

看下 $format 列表:

CodeDescription
aNUL-padded string
ASPACE-padded string
hHex string, low nibble first
HHex string, high nibble first
csigned char
Cunsigned char
ssigned short (always 16 bit, machine byte order)
Sunsigned short (always 16 bit, machine byte order)
nunsigned short (always 16 bit, big endian byte order)
vunsigned short (always 16 bit, little endian byte order)
isigned integer (machine dependent size and byte order)
Iunsigned integer (machine dependent size and byte order)
lsigned long (always 32 bit, machine byte order)
Lunsigned long (always 32 bit, machine byte order)
Nunsigned long (always 32 bit, big endian byte order)
Vunsigned long (always 32 bit, little endian byte order)
qsigned long long (always 64 bit, machine byte order)
Qunsigned long long (always 64 bit, machine byte order)
Junsigned long long (always 64 bit, big endian byte order)
Punsigned long long (always 64 bit, little endian byte order)
ffloat (machine dependent size and representation)
ddouble (machine dependent size and representation)
xNUL byte
XBack up one byte
ZNUL-padded string (new in PHP 5.5)
@NUL-fill to absolute position
我们使用的是 'H' - 十六进制格式,每次格4位,高四位在前,默认读取10进制数据(我也不懂。。。。)
'\\1' 是 preg_replace() 里的向后引用,即匹配到的单个 '\uxxxx' 中文unicode编码。

最终再结合iconv(),得到了 "中文汉字"!

1.看来 pack() 也得查查了,先链接一个:


 


PHP: 深入pack/unpack

大家可以看看这篇作者的其它pack相关,貌似很屌!我看了这篇,感觉作者应该很厉害
手册上,说pack是根据perl的pack,所以,有人说了句:想搞懂,需要看这个:
http://perldoc.perl.org/perlpacktut.html - 貌似是perl文档

涉及的都太底层了,网络传输等


2.json_encode()中文乱码的3种解决方案总结,总结的也不错,转载过来:

php json_encode 中文乱码解决方法


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息