先上一个能复现的代码:
```
<?php
$str = '"'.chr(11).'"';
var_dump(json_decode($str), json_last_error(), json_last_error_msg());
```
但这个并不是 php 的实现问题,实际上如果你在 js 中(我只在 firefox56 中进行了测试)
```
JSON.parse('"\x0b"');
```
实际上你也会得到类似的出错信息:SyntaxError: JSON.parse: bad control character in string literal at line 1 column 2 of the JSON data
原因是什么呢?如果你查看 json 的定义(
http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf ),其中对于 string 做了明确的定义:
A string is a sequence of Unicode code points wrapped with quotation marks (U+0022). All code points may be placed within the quotation marks except for the code points that must be escaped: quotation mark (U+0022), reverse solidus (U+005C), and the control characters U+0000 to U+001F.
注意其中非常明确指出了控制符(\x00-\x1f )需要被转义,否则这就是一个非法的 json。所以在这种情况下只能说微信不负责任的给了一个非法的 json,@lcy630409 在 14 楼的代码就可以算是一个解决方案(直接过滤掉无效字符)
@
reus 不了解真相的开喷,只能说明你自己是。。。
@
raysonlu 早期微信的确没有过滤控制字符。然后通过这些字符(比如\u202e )在一些时候(比如撤回消息)时会出现一些神奇的效果。当然现在已经在改名时过滤了。但之前改的那些依然有效。