php json_encode 中文乱码解决方法

之前,项目中就碰到了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 列表:

Code Description
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 中文乱码解决方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值