PHP 解析微信用户信息昵称中有特殊字符,一个点, json 无法解析

2018-10-17 09:45:44 +08:00
 lcy630409

http://file.whzxc.cn/126.png 如图,获取微信用户信息中的昵称,这个点,php json 解析不了,复制到百度 百度都直接跳到首页了 使用 mb_convert_encoding(,'utf-8','utf-8') 也不行 谁知道怎么过滤么

8039 次点击
所在节点    PHP
29 条回复
sobigfish
2018-10-17 14:01:31 +08:00
@lcy630409 #18 16 楼 wei745359223 给你说了,jsonlasterr 3 就是 JSON_ERROR_CTRL_CHAR,这个就是指控制字符,但微信可能并没有传(只是你后期自己测试复制了换行字符类的)
你可以直接试试微信传过来的,直接 json_decode(mb_convert_encoding())看可以不
cyspy
2018-10-17 16:02:54 +08:00
看起来是某种分隔符(小节符号)。无论如何,理论上 JSON 里只能出现 ASCII Escape,其他的都算非法 JSON
raysonlu
2018-10-17 16:49:17 +08:00
微信给用户改昵称的时候不把用户的控制符去掉的么?
zxq2233
2018-10-17 18:38:40 +08:00
为什么不用 JAVA
IceBay
2018-10-17 18:51:48 +08:00
@zxq2233 #24 这是什么逻辑?
topzyh
2018-10-17 22:57:34 +08:00
我遇到过,用 utf8mb4 就行了,如果你用了 TP 之类的框架,框架里也要设置
jhdxr
2018-10-17 23:35:55 +08:00
先上一个能复现的代码:
```
<?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 )在一些时候(比如撤回消息)时会出现一些神奇的效果。当然现在已经在改名时过滤了。但之前改的那些依然有效。
mumu
2018-10-18 15:32:43 +08:00
我都 base64 编码加密,然后输出的时候直接解密输出。
king2014
2018-10-18 16:16:14 +08:00
@mumu 这位说的对
一般不都是 base64 解决的吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/498336

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX