【问题标题】:PHP Parsing Problem -   and ÂPHP 解析问题 - 和
【发布时间】:2011-05-29 17:51:45
【问题描述】:

当我尝试解析一些带有  的html,然后echo 它,  “变成”这个字符:Â。此外,html_entity_decode()str_replace() 不会改变它。

为什么会这样?如何删除 Â?

【问题讨论】:

  • 它“转动”还是被浏览器解释为这样?

标签: php html parsing character-encoding


【解决方案1】:

non-breaking space 存在于两个字节的UTF-8 中:0xC20xA0

当这些字节以ISO-8859-1(单字节编码)而不是UTF-8(多字节编码)表示时,这些字节分别变为字符Â和另一个不间断空格 .

显然您正在使用 UTF-8 解析 HTML 并使用 ISO-8859-1 回显结果。要解决此问题,您需要要么 使用 ISO-8859-1 解析 HTML, 使用 UTF-8 回显结果。我建议一直使用 UTF-8。通过PHP UTF-8 cheatsheet 将其全部对齐。

【讨论】:

    【解决方案2】:
    html_entity_decode(" ") == '\xa0'
    

    我认为按照设计,我不明白为什么 str_replace 不适合你,试试这个 sn-p:

    $nbsp = html_entity_decode(" ");
    $s = html_entity_decode("[ ]");
    $s = str_replace($nbsp, " ", $s);
    echo $s;
    

    也许 \xa0 它不是一个有效的 unicode 字符串,因此使用 html_entity_decode() 的结果可能更适合文本替换而不是 \xa0。

    BalusC 的解释看起来很合理,您可能会尝试在其中插入 utf-8 \xc2\xa0 然后尝试将其显示为拉丁语而不是 utf8,如果您想使用 unicode 的东西,您应该在任何地方保留 utf-8 编码,从服务器的字符集到数据库,因为你在使用时会遇到同样的问题,例如à

    【讨论】:

      【解决方案3】:

      preg_replace() 也可以做到这一点:

      preg_replace("/&#?[a-z0-9]{2,8};/i","", $var);
      

      【讨论】:

        猜你喜欢
        • 2011-08-02
        • 2013-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-03
        • 2012-07-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多