当前位置: 首页 > 后端技术 > PHP

json_encode使用JSON_UNESCAPED_UNICODE

时间:2023-03-29 14:35:41 PHP

来提问。PHP原生的json_encode方法在对中文进行编码时,不带参数JSON_UNESCAPED_UNICODE,得到一串类似\uXXXX的字符串,参数就是我们平时看到的中文。发生了什么?确认现象//1.php1.txt#ls-l1.txt-rw-r--r--1rootroot8Jun1215:211.txt#cat1.txt"\u597d"//2.php2.txt#ls-l2.txt-rw-r--r--1rootroot5Jun1215:232.txt#cat2.txt“好吧”我先说结论。我们平时使用的json格式是utf-8编码,但是它识别utf-16编码的转义。即显示正常的是utf-8编码;\u597d单个字符(6个字符)传输的时候也是utf-8编码,但是详细分析的时候判断是有转义,而\,这六个字符u,5,9,7,和d适合作为UTF-16编码。json_encode增加参数JSON_UNESCAPED_UNICODE,不对字符进行utf-16转义,直接使用utf-8。由于没有使用转义,整个字符串的大小也从8个字节减少到5个字节。原因是转义符\u597d中每个字符占1个字节,一共6个字节,而好的utf-8编码只有3个字节,少了3个字节。验证hexdump是否可以查看二进制格式的文本文件。对于后面的-c参数,如果单个字节有对应的ascii码,则直接以ascii码格式显示,否则以对应的八进制数显示;对于-b参数,每个字节将以八进制数显示。#hexdump-C1.txt0000000"\u597d"0000008//八边形格式#hexdump-b1.TXT00000000421341650671440420000008#hexdump-C2.TXT000000000"345240/00050/000"/八进制格式#hexdump-b2.txt00000000423452452750420000005以上使用od-w1-b2.txt和hexdump效果一样从上面的输出不难看出对应的字节八进制数应该是345、245、275,换算成二进制分别是11100101、10100101、10111101。二进制也可以转换成十六进制数,但是有一个字节顺序的字节序问题。哪一个开始,对应的开头是275还是345?突破点对应3个字节,3字节utf-8编码的开头一定是1110(见阮一峰的字符编码笔记:ASCII、Unicode和UTF-8),正好是345的开头,并且字符部分的内部结构也是大端的。确定bigendian之后,想到常说的网络字节序就是bigendian。按照json标准,utf-16和utf-32有大小端区分,而utf-8没有,所以utf-8编码的json应该是大端。(不知道多字节字符如果是littleendian怎么判断。)二进制转十六进制,分别是E5,A5,BD,找了一个在线代码转换验证,验证是否传输错误。得到结果:字符编码十进制编码十六进制Unicode编码十进制Unicode编码十六进制好15050173E5A5BD22909597DE5A5BD对上。另一个在线编码转换网站得到的转换结果是好,实际上是utf-8对应的unicode码位,并不是想要的utf-8编码,严重误导。网上很多在线打码网站都是这样的。一些定义指出json是一种传输协议,指定用于交互的文本组织。JSON通常以utf-8编码,但这不是必需的。unicode是一个标准,它为每个字符唯一地定义了一个unicode代码点。utf-8、utf-16等是unicode码位的编码方式。比如utf-8编码对应的字节数是1-4个字节。由于短字节数较少,优先分配给较常用的字符(unicode码位)。参考json标准http://www.json.org.cn/standa...字符编码说明:ASCII、Unicode和UTF-8http://www.ruanyifeng.com/blo...Unicode和JavaScript详解解释http://www.ruanyifeng.com/blo...JSON序列化中的转义和Unicode编码https://segmentfault.com/a/11...鸟哥的让Json更好地理解中文(JSON_UNESCAPED_UNICODE)https://www.laruence.com/2011...在线将中文转为utf-8编码十六进制,Unicode编码十六进制http://www.mytju.com/classcod...在线将中文转为Unicode编码十六进制(本网站为误导,其实是转成Unicode编码十六进制,缺少据说是utf-8)https://utf8.supfree.net/ascii码表对照http://ascii.911cha.com/linuxod工具,查看文件的二进制格式https://wangchujiang.com/linu...Linux命令学习总结:hexdumphttps://www.cnblogs.com/kerry...