V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hoythan
V2EX  ›  PHP

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

  •  1
     
  •   hoythan · 2017-02-13 18:54:31 +08:00 · 5304 次点击
    这是一个创建于 2844 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    第 1 条附言  ·  2017-02-14 10:35:32 +08:00
    解决了,echo 之前加 ob_clear();

    代码有顶格,无 bom, 是 utf-8.
    29 条回复    2017-02-18 08:11:50 +08:00
    NFSwind
        1
    NFSwind  
       2017-02-13 18:56:21 +08:00
    你起码也贴一个截图啊
    yov123456
        2
    yov123456  
       2017-02-13 19:03:19 +08:00 via iPhone
    我也有遇到… android 下解析不了…
    helloccav
        3
    helloccav  
       2017-02-13 19:03:59 +08:00 via Android
    第一感觉就是 utf-8 bom ,可是你又说了不是这个问题,那就不知道是怎么回事了
    iyaozhen
        4
    iyaozhen  
       2017-02-13 19:04:18 +08:00
    给的信息太少了。你现在说的这些正常情况下不会有问题
    LevineChen
        5
    LevineChen  
       2017-02-13 19:07:03 +08:00
    八成就是 bom 头, Unix 上用 curl 返回输出到一个文件上去 , hexdump 瞧眼
    hoythan
        6
    hoythan  
    OP
       2017-02-13 19:07:54 +08:00
    @LevineChen 可是只有占一个字符串,而且我去除 bom 还是这样.
    hoythan
        7
    hoythan  
    OP
       2017-02-13 19:09:34 +08:00
    @LevineChen
    @yov123456
    @NFSwind


    ï 这玩意.
    mcfog
        8
    mcfog  
       2017-02-13 19:12:14 +08:00
    楼主的代码啊, naïve
    Sunyanzi
        9
    Sunyanzi  
       2017-02-13 19:12:52 +08:00   ❤️ 1
    我估计就是你哪个文件没顶格 ... 如果你不会全文件查找什么的 ... 用 ob 系列函数把输出清了吧 ...
    Felldeadbird
        10
    Felldeadbird  
       2017-02-13 20:34:06 +08:00
    这个情况,通常是没转换编码。试下 mb_ 开头的转换函数处理一下,再输出 json 。
    claysec
        11
    claysec  
       2017-02-14 09:19:09 +08:00
    这样怎么解决问题。。。
    hoythan
        12
    hoythan  
    OP
       2017-02-14 09:41:53 +08:00
    @claysec 我加了一个 ob_clear 不知道有没有用,有用再告诉你们...
    BOYPT
        13
    BOYPT  
       2017-02-14 09:55:00 +08:00
    echo 是不会输出不指定字符的,只可能出现在你的文件没顶格上;
    按 16 进制查看你的乱码字符是什么,然后用 grep 去查出这个字符的出处,修改对应文件。
    hoythan
        14
    hoythan  
    OP
       2017-02-14 09:57:03 +08:00
    @BOYPT 文件没顶格是什么意思?
    BOYPT
        15
    BOYPT  
       2017-02-14 09:58:47 +08:00
    @hoythan

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



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

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

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

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

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

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

    当然,其实如果真是因为主动输出导致出现了 Output Buffer 的问题,可能说明你手头的代码已经很脏了,还是找机会重构吧。
    mingyun
        29
    mingyun  
       2017-02-18 08:11:50 +08:00
    @bianhua 厉害了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1317 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 17:50 · PVG 01:50 · LAX 09:50 · JFK 12:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.