【问题标题】:getting json_encode to not escape html entities让 json_encode 不转义 html 实体
【发布时间】:2010-07-27 17:35:41
【问题描述】:

我将json_encoded 数据从我的 PHP 服务器发送到 iPhone 应用程序。包含 html 实体的字符串,如 '&'json_encode 转义并作为 & 发送。

我想做以下两件事之一:

  • 使 json_encode 不转义 html 实体。医生说“正常”模式不应该逃避它,但它对我不起作用。有什么想法吗?

  • 以低廉的成本使 iPhone 应用程序取消转义 html 实体。我现在能想到的唯一方法是启动一个非常昂贵的XML/HTML parser。有更便宜的建议吗?

谢谢!

【问题讨论】:

    标签: php iphone objective-c cocoa json


    【解决方案1】:

    PHP 5.3 和 PHP 5.2 都没有触及 HTML 实体。

    您可以使用以下代码test这个:

    <?php
    header("Content-type: text/plain"); //makes sure entities are not interpreted
    $s = 'A string with &amp; &#x6F8 entities';
    echo json_encode($s);
    

    您会看到 PHP 所做的唯一事情就是在字符串周围添加双引号。

    【讨论】:

      【解决方案2】:

      json_encode 不这样做。您有另一个组件正在执行 HTML 编码。

      如果您使用JSON_HEX_ 选项,您可以避免任何&lt;&amp; 字符出现在输出中(它们将被转换为\u003C 或类似的JS 字符串文字转义),从而可能避免问题:

      json_encode($s, JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_QUOT)
      

      虽然这将取决于确切知道哪些字符正在进一步下游进行 HTML 编码。也可能是非 ASCII 字符?

      【讨论】:

        【解决方案3】:

        根据manual,似乎 json_encode 不应该转义您的实体,除非您在 PHP 5.3 中明确告诉它转义。您是否正在运行旧版本的 PHP?

        【讨论】:

        • 是的,我使用的是 5.2.6 所以 pre-5.3 json_encode 默认没有转义 html 实体?
        【解决方案4】:

        离开 Artefacto 的回答,我建议使用此标头,它专为 JSON 数据而设计,而不仅仅是使用纯文本。

        <?php
        header('Content-Type: application/json'); //Also makes sure entities are not interpreted
        $s = 'A string with &amp; &#x6F8 entities';
        echo json_encode($s);
        

        请务必查看这篇文章,了解使用此内容类型的更具体原因,What is the correct JSON content type?

        【讨论】:

          猜你喜欢
          • 2020-05-02
          • 2017-09-12
          • 1970-01-01
          • 1970-01-01
          • 2011-04-11
          • 2011-12-08
          相关资源
          最近更新 更多