【问题标题】:Why does JSON encoder adds escaping character when encoding URLs?为什么 JSON 编码器在编码 URL 时会添加转义字符?
【发布时间】:2010-09-16 02:11:14
【问题描述】:

我在 PHP 中使用json_encode 对 URL 进行编码

$json_string = array ('myUrl'=> 'http://example.com');
echo json_encode ($json_string);

以上代码生成如下 JSON 字符串:

{"myUrl":"http:\/\/example.com"}   

而不是

{"myUrl":"http://example.com"}

我只是新手,哪个输出是正确的? JSON 解析器是否能够正确评估第二个输出?

【问题讨论】:

    标签: php json


    【解决方案1】:

    根据https://www.json.org/,应该转义该字符,尽管在 JavaScript 中并非绝对必要:

    另请阅读 php.net 上的 related bug report 进行简短讨论。

    RFC的2.5:

    所有 Unicode 字符都可以放置 引号内除了 必须转义的字符: 引号、反向固相线和 控制字符(U+0000 到 U+001F)。

    任何字符都可以转义。

    所以听起来它需要被转义,但它可以,并且网站(以及 RFC 中的文本图)将其说明为被转义。

    【讨论】:

      【解决方案2】:

      我的猜测是,该函数的编写者通过纯无知添加了不必要的编码。 不需要转义正斜杠。

      我认识的大量程序员在保持斜线笔直方面与世界其他地方一样糟糕。更多的人在正确编码和解码方面确实很差。

      更新:

      经过一番搜索,我发现了this discussion。它提出了一个很好的观点,即转义 / 对于糟糕的 HTML 解析器有时是必要的。我曾经遇到过一个问题,当 IE 6 错误地处理这样的内容时:

      <script>
          var json = { scriptString: "<script> /* JavaScript here */ </script>" };
      </script>
      

      IE 6 会在字符串中看到&lt;/script&gt; 并过早关闭脚本标记。因此,这在 IE 6 中更安全(尽管字符串中的开始脚本标记也可能会破坏......我不记得了):

      <script>
          var json = { scriptString: "<script> \/* JavaScript here *\/ <\/script>" };
      </script>
      

      他们还说,一些糟糕的解析器会在 http:// 中看到 //,并将该行的其余部分视为 JavaScript 注释。

      所以看起来这是又一个互联网技术被 Browser Fail 劫持的案例。

      【讨论】:

      • 我同意。但值得注意的是,生成的字符串 is 有效。在 javascript 字符串中,您可以通过在 any 字符前面加上反斜杠来转义它。所以“\/”被 Javascript 解释为简单的 '/'。
      • JSON 与 JavaScript 不同。在 JSON 中,您不允许使用任何您喜欢的反斜杠。但奇怪的是,你可以在字符串中反斜杠,所以它仍然有效。 :)
      【解决方案3】:

      如果您使用的是 php 5.4,您可以使用 json_encode 选项。见manual

      在 php 5.3 中添加了几个选项,但在 5.4 中添加了 JSON_UNESCAPED_SLASHES

      【讨论】:

        【解决方案4】:

        我认为这可以解决您的问题

        json_encode ($json_string, JSON_UNESCAPED_SLASHES );
        

        您可以查看文档:

        https://www.php.net/manual/en/function.json-encode.php

        https://www.php.net/manual/en/json.constants.php

        【讨论】:

          【解决方案5】:

          我在这里看到另一个问题。字符串结果 {"myUrl":"http://example.com"} 不应引用成员名称 myUrl。在 JavaScript 和 JSON 中,我认为所有对象字面量成员 id 都是不带引号的字符串。所以,我希望结果是{myUrl:"http://example.com"}

          这似乎是PHP中的一个太大的错误,所以我一定是错的。

          编辑,2/11/11:是的,我错了。 JSON 语法甚至要求字段名称用双引号括起来。

          【讨论】:

            猜你喜欢
            • 2014-08-25
            • 2018-05-06
            • 2012-02-23
            • 2017-08-17
            • 2014-01-18
            • 2011-03-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多