php 页面写了一个 array() 通过 json_encode() echo 出一个 json 字符串作为 api 页面.
然后发现这个页面在使用 c#程序获取的时候前面会多出一个字符,经过测试不是 utf-8 bom 这个东西,但是不知道如何解决...懵逼
1
NFSwind 2017-02-13 18:56:21 +08:00
你起码也贴一个截图啊
|
2
yov123456 2017-02-13 19:03:19 +08:00 via iPhone
我也有遇到… android 下解析不了…
|
3
helloccav 2017-02-13 19:03:59 +08:00 via Android
第一感觉就是 utf-8 bom ,可是你又说了不是这个问题,那就不知道是怎么回事了
|
4
iyaozhen 2017-02-13 19:04:18 +08:00
给的信息太少了。你现在说的这些正常情况下不会有问题
|
5
LevineChen 2017-02-13 19:07:03 +08:00
八成就是 bom 头, Unix 上用 curl 返回输出到一个文件上去 , hexdump 瞧眼
|
6
hoythan OP @LevineChen 可是只有占一个字符串,而且我去除 bom 还是这样.
|
7
hoythan OP |
8
mcfog 2017-02-13 19:12:14 +08:00
楼主的代码啊, naïve
|
9
Sunyanzi 2017-02-13 19:12:52 +08:00 1
我估计就是你哪个文件没顶格 ... 如果你不会全文件查找什么的 ... 用 ob 系列函数把输出清了吧 ...
|
10
Felldeadbird 2017-02-13 20:34:06 +08:00
这个情况,通常是没转换编码。试下 mb_ 开头的转换函数处理一下,再输出 json 。
|
11
claysec 2017-02-14 09:19:09 +08:00
这样怎么解决问题。。。
|
13
BOYPT 2017-02-14 09:55:00 +08:00
echo 是不会输出不指定字符的,只可能出现在你的文件没顶格上;
按 16 进制查看你的乱码字符是什么,然后用 grep 去查出这个字符的出处,修改对应文件。 |
17
zhengkai 2017-02-14 10:10:56 +08:00
还有, PHP 结尾如果没其他东西不要写 ?>
|
19
jarlyyn 2017-02-14 10:28:54 +08:00
找个地方加 header
然后 php 有个命令可以查的,什么地方有额外输出。 |
20
billychow 2017-02-14 10:29:23 +08:00
这个我碰到过…… 不知道是不是 TP 的锅,后来我在 nginx 的配置里加上 charset utf8; 就搞定了
|
23
ywisax 2017-02-14 10:35:07 +08:00
这事情,九成九是文件编码问题。你某个 php 版本编码可能是非 utf8
|
24
bianhua 2017-02-14 10:51:13 +08:00
ob_clear ?很大可能这又是个 dirty fix 。
你应该将返回的 JSON 下载回来,看文件最前面两个字节的数据是什么。 |
26
bianhua 2017-02-14 12:16:17 +08:00
@hoythan
后面是 C3 AF C2 BB 么?仍然是 BOM 头,只是转换过。而如果是 EF BB BF 则是没有转换过的。 https://en.wikipedia.org/wiki/Byte_order_mark 我可以猜想你当前看到的代码应该很乱 :D 想要解决这个问题,你可以写一个扫描器枚举所有目录,然后找到所有前三个字节是 EF BB BF 的文件,把这些文件从新用 UTF-8 Without BOM 存一下就行了。 https://secure.php.net/manual/en/class.directoryiterator.php https://secure.php.net/manual/en/class.filesystemiterator.php Good luck 。 |
28
bianhua 2017-02-14 18:32:00 +08:00
@hoythan
你有没有扫描过所有的文件? 一个典型的 PHP 程序文件应该以“<?php 开头”。这个标签开始之前不应该有任何东西,包括不可见字符。 当然还有一种可能性,就是你手头上的程序主动输出了那些内容。如果是这样, Debug 会变得很复杂:你需要去掉所有的 Output Buffer 控制(就是让内容直接输出),然后用 headers_list 以及 headers_sent 函数检查到底是谁发送了“ï”字符。 当然,其实如果真是因为主动输出导致出现了 Output Buffer 的问题,可能说明你手头的代码已经很脏了,还是找机会重构吧。 |