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

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

  •  1
     
  •   hoythan Feb 13, 2017 5917 views
    This topic created in 3386 days ago, the information mentioned may be changed or developed.

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

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

    Supplement 1    Feb 14, 2017
    解决了,echo 之前加 ob_clear();

    代码有顶格,无 bom, 是 utf-8.
    29 replies    2017-02-18 08:11:50 +08:00
    NFSwind
        1
    NFSwind  
       Feb 13, 2017
    你起码也贴一个截图啊
    yov123456
        2
    yov123456  
       Feb 13, 2017 via iPhone
    我也有遇到… android 下解析不了…
    helloccav
        3
    helloccav  
       Feb 13, 2017 via Android
    第一感觉就是 utf-8 bom ,可是你又说了不是这个问题,那就不知道是怎么回事了
    iyaozhen
        4
    iyaozhen  
       Feb 13, 2017
    给的信息太少了。你现在说的这些正常情况下不会有问题
    Enivel
        5
    Enivel  
    PRO
       Feb 13, 2017
    八成就是 bom 头, Unix 上用 curl 返回输出到一个文件上去 , hexdump 瞧眼
    hoythan
        6
    hoythan  
    OP
       Feb 13, 2017
    @LevineChen 可是只有占一个字符串,而且我去除 bom 还是这样.
    hoythan
        7
    hoythan  
    OP
       Feb 13, 2017
    mcfog
        8
    mcfog  
       Feb 13, 2017
    楼主的代码啊, nave
    Sunyanzi
        9
    Sunyanzi  
       Feb 13, 2017   1
    我估计就是你哪个文件没顶格 ... 如果你不会全文件查找什么的 ... 用 ob 系列函数把输出清了吧 ...
    Felldeadbird
        10
    Felldeadbird  
       Feb 13, 2017
    这个情况,通常是没转换编码。试下 mb_ 开头的转换函数处理一下,再输出 json 。
    claysec
        11
    claysec  
       Feb 14, 2017
    这样怎么解决问题。。。
    hoythan
        12
    hoythan  
    OP
       Feb 14, 2017
    @claysec 我加了一个 ob_clear 不知道有没有用,有用再告诉你们...
    BOYPT
        13
    BOYPT  
       Feb 14, 2017
    echo 是不会输出不指定字符的,只可能出现在你的文件没顶格上;
    按 16 进制查看你的乱码字符是什么,然后用 grep 去查出这个字符的出处,修改对应文件。
    hoythan
        14
    hoythan  
    OP
       Feb 14, 2017
    @BOYPT 文件没顶格是什么意思?
    BOYPT
        15
    BOYPT  
       Feb 14, 2017
    @hoythan

    php 文件在<?php 之前的所有字符都原样输出
    hoythan
        16
    hoythan  
    OP
       Feb 14, 2017
    @BOYPT 这个肯定顶了,强迫症不允许我不顶
    zhengkai
        17
    zhengkai  
       Feb 14, 2017
    还有, PHP 结尾如果没其他东西不要写 ?>
    hoythan
        18
    hoythan  
    OP
       Feb 14, 2017
    @zhengkai 也没写 直接 Exit 就没写任何东西了...
    jarlyyn
        19
    jarlyyn  
       Feb 14, 2017
    找个地方加 header



    然后 php 有个命令可以查的,什么地方有额外输出。
    billychow
        20
    billychow  
       Feb 14, 2017
    这个我碰到过…… 不知道是不是 TP 的锅,后来我在 nginx 的配置里加上 charset utf8; 就搞定了
    hoythan
        21
    hoythan  
    OP
       Feb 14, 2017
    @jarlyyn 也没有,非常简单,直接 Header 后面写 echo json 后面写 exit;
    jarlyyn
        22
    jarlyyn  
       Feb 14, 2017
    @hoythan

    写 header 是因为有正文输出后就不能改 header 了,确认是不是有额外输出。
    ywisax
        23
    ywisax  
       Feb 14, 2017
    这事情,九成九是文件编码问题。你某个 php 版本编码可能是非 utf8
    bianhua
        24
    bianhua  
       Feb 14, 2017
    ob_clear ?很大可能这又是个 dirty fix 。

    你应该将返回的 JSON 下载回来,看文件最前面两个字节的数据是什么。
    hoythan
        25
    hoythan  
    OP
       Feb 14, 2017
    @bianhua 这玩意.
    bianhua
        26
    bianhua  
       Feb 14, 2017
    @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
        27
    hoythan  
    OP
       Feb 14, 2017
    @bianhua 只有 没有其他任何东西,尝试用去除 bom 的相关代码,但是根本没有 bom 头的东西.
    bianhua
        28
    bianhua  
       Feb 14, 2017
    @hoythan

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

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

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

    当然,其实如果真是因为主动输出导致出现了 Output Buffer 的问题,可能说明你手头的代码已经很脏了,还是找机会重构吧。
        29
    mingyun  
       Feb 18, 2017
    @bianhua 厉害了
    About     Help     Advertise     Blog     API     FAQ     Solana     853 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 78ms UTC 20:48 PVG 04:48 LAX 13:48 JFK 16:48
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86