如何解决 PHP 输出 json 页面的时候,程序获取时前面有一个乱码字符的问题?

2017-02-13 18:54:31 +08:00
 hoythan

php 页面写了一个 array() 通过 json_encode() echo 出一个 json 字符串作为 api 页面.

然后发现这个页面在使用 c#程序获取的时候前面会多出一个字符,经过测试不是 utf-8 bom 这个东西,但是不知道如何解决...懵逼

5173 次点击
所在节点    PHP
29 条回复
hoythan
2017-02-14 10:32:29 +08:00
@jarlyyn 也没有,非常简单,直接 Header 后面写 echo json 后面写 exit;
jarlyyn
2017-02-14 10:33:37 +08:00
@hoythan

写 header 是因为有正文输出后就不能改 header 了,确认是不是有额外输出。
ywisax
2017-02-14 10:35:07 +08:00
这事情,九成九是文件编码问题。你某个 php 版本编码可能是非 utf8
bianhua
2017-02-14 10:51:13 +08:00
ob_clear ?很大可能这又是个 dirty fix 。

你应该将返回的 JSON 下载回来,看文件最前面两个字节的数据是什么。
hoythan
2017-02-14 11:46:48 +08:00
@bianhua ï 这玩意.
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 。
hoythan
2017-02-14 13:02:42 +08:00
@bianhua 只有ï 没有其他任何东西,尝试用去除 bom 的相关代码,但是根本没有 bom 头的东西.
bianhua
2017-02-14 18:32:00 +08:00
@hoythan

你有没有扫描过所有的文件?

一个典型的 PHP 程序文件应该以“<?php 开头”。这个标签开始之前不应该有任何东西,包括不可见字符。

当然还有一种可能性,就是你手头上的程序主动输出了那些内容。如果是这样, Debug 会变得很复杂:你需要去掉所有的 Output Buffer 控制(就是让内容直接输出),然后用 headers_list 以及 headers_sent 函数检查到底是谁发送了“ï”字符。

当然,其实如果真是因为主动输出导致出现了 Output Buffer 的问题,可能说明你手头的代码已经很脏了,还是找机会重构吧。
mingyun
2017-02-18 08:11:50 +08:00
@bianhua 厉害了

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

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

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

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

© 2021 V2EX