我正在编写一个使用 json 来表示其资源的 web 服务,但我对编码 json 的最佳方式感到有点困惑。阅读 json rfc (http://www.ietf.org/rfc/rfc4627.txt),很明显首选编码是 utf-8。但是 rfc 还描述了一种用于指定字符的字符串转义机制。我认为这通常用于转义非 ascii 字符,从而使生成的 utf-8 有效 ascii。
因此,假设我有一个 json 字符串,其中包含非 ascii 的 unicode 字符(代码点)。我的网络服务应该只是 utf-8 编码并返回它,还是应该转义所有那些非 ascii 字符并返回纯 ascii?
我希望浏览器能够使用 jsonp 或 eval 执行结果。这会影响决定吗?我缺乏对各种浏览器对 utf-8 的 javascript 支持的了解。
编辑:我想澄清一下,我对如何编码结果的主要关注实际上是浏览器对结果的处理。我读到的内容表明,特别是在使用 JSONP 时,浏览器可能对编码很敏感。我还没有找到关于这个主题的任何真正好的信息,所以我必须开始做一些测试来看看会发生什么。理想情况下,我只想转义那些需要的几个字符,只对结果进行 utf-8 编码。
JSON 规范要求解码器支持 UTF-8。因此,所有 JSON 解码器都可以像处理数字转义序列一样处理 UTF-8。 Javascript 解释器也是如此,这意味着 JSONP 也将处理 UTF-8 编码的 JSON。
JSON 编码器使用数字转义序列的能力只是为您提供了更多选择。您可以选择数字转义序列的一个原因是,如果您的编码器和预期解码器之间的传输机制不是二进制安全的。
您可能要使用数字转义序列的另一个原因是为了防止某些字符出现在流中,例如 <
、&
和 "
,如果 JSON 代码没有转义,它们可能会被解释为 HTML 序列HTML 或浏览器错误地将其解释为 HTML。这可以防御 HTML 注入或跨站点脚本(注意:某些字符必须在 JSON 中转义,包括 "
和 \
)。
一些框架,包括 PHP 的 json_encode()
(默认情况下),总是在编码器端为 ASCII 之外的任何字符执行数字转义序列。这是一个主要是不必要的额外步骤,旨在最大限度地与有限的传输机制等兼容。但是,这不应被解释为任何 JSON 解码器都存在 UTF-8 问题的迹象。
所以,我想你可以像这样决定使用哪个:
只需使用 UTF-8,除非您用于在编码器和解码器之间进行存储或传输的任何软件都不是二进制安全的。
否则,使用数字转义序列。
我在那里遇到了问题。当我使用像“é”这样的字符对字符串进行 JSON 编码时,每个浏览器都会返回相同的“é”,除了 IE 会返回“\u00e9”。
然后使用 PHP json_decode(),如果找到“é”,它将失败,所以对于 Firefox、Opera、Safari 和 Chrome,我必须在 json_decode() 之前调用 utf8_encode()。
注意:在我的测试中,IE 和 Firefox 使用它们的原生 JSON 对象,其他浏览器使用 json2.js。
utf8_encode()
、php.net/manual/en/function.utf8-encode.php
ASCII 不在其中了。使用 UTF-8 编码意味着您没有使用 ASCII 编码。你应该使用转义机制是 RFC 所说的:
除了必须转义的字符外,所有 Unicode 字符都可以放在引号内:引号、反斜线和控制字符(U+0000 到 U+001F)
我面临着同样的问题。这个对我有用。请检查这个。
json_encode($array,JSON_UNESCAPED_UNICODE);
阅读 json rfc (http://www.ietf.org/rfc/rfc4627.txt) 很明显首选编码是 utf-8。
仅供参考,RFC 4627 不再是官方 JSON 规范。它在 2014 年被 RFC 7159 淘汰,然后在 2017 年被当前规范的 RFC 8259 淘汰。
RFC 8259 指出:
8.1。在不属于封闭生态系统的系统之间交换的字符编码 JSON 文本必须使用 UTF-8 [RFC3629] 进行编码。以前的 JSON 规范没有要求在传输 JSON 文本时使用 UTF-8。然而,绝大多数基于 JSON 的软件实现都选择使用 UTF-8 编码,以至于它是唯一实现互操作性的编码。实现不得在网络传输的 JSON 文本的开头添加字节顺序标记 (U+FEFF)。为了互操作性,解析 JSON 文本的实现可能会忽略字节顺序标记的存在,而不是将其视为错误。
我对 é char 也有类似的问题...我认为“您输入的文本可能不是 UTF-8”的评论可能接近此处的标记。我有一种感觉,在我意识到并更改为 utf8 之前,我的实例中的默认排序规则是别的东西......问题是数据已经存在,所以不确定它是否在我更改数据时转换了数据,在 mysql 中显示正常工作台。最终结果是php不会对数据进行json编码,只是返回false。无论您使用什么浏览器作为导致我的问题的服务器,如果存在此字符,php 将不会将数据解析为 utf8。就像我说的不确定是由于在数据出现后将架构转换为 utf8 还是只是一个 php 错误。在这种情况下使用 json_encode(utf8_encode($string));
不定期副业成功案例分享