JSON字符编码 - 浏览器是否支持UTF-8,还是应该使用数字转义序列?

sch*_*ckb 78 unicode json web-services utf-8

我正在编写一个使用json来表示其资源的web服务,我有点想到编写json的最佳方法.阅读json rfc(http://www.ietf.org/rfc/rfc4627.txt)显然首选的编码是utf-8.但rfc还描述了一种用于指定字符的字符串转义机制.我假设这通常用于转义非ascii字符,从而使得得到的utf-8有效ascii.

所以,假设我有一个json字符串,其中包含非ascii的unicode字符(代码点).我的webservice应该只是utf-8编码并返回它,还是应该逃脱所有那些非ascii字符并返回纯ascii?

我希望浏览器能够使用jsonp或eval执行结果.这会影响决定吗?我对各种浏览器对utf-8的javascript支持的了解很少.

编辑:我想澄清一下,我对如何对结果进行编码的主要关注点是关于结果的浏览器处理.我读过的内容表明,特别是在使用JSONP时,浏览器可能对编码很敏感.我没有找到关于这个主题的任何非常好的信息,所以我将不得不开始做一些测试,看看会发生什么.理想情况下,我只想逃避所需的几个字符,只需对utf-8进行编码即可.

tho*_*ter 77

正如JSON规范所要求的那样,所有JSON解析器都可以处理正确的UTF-8以及数字转义序列.

JSON编码器使用数字转义序列的能力只是为您提供了更多选择.您可以选择数字转义序列的一个原因是编码器和目标解码器之间的传输机制不是二进制安全的.

你可能想要使用数字转义序列的另一个原因是为了防止出现在流中的某些字符,例如<,&",如果JSON代码被置于不逃逸到HTML或浏览器错误地将其解释为HTML,其可被解释为HTML序列.这可以防止HTML注入或跨站点脚本(注意:一些字符必须在JSON中转义,包括"\).

一些框架,包括PHP的JSON实现,总是在编码器端为ASCII以外的任何字符执行数字转义序列.这旨在最大限度地兼容有限的传输机制等.但是,这不应被解释为JSON解码器存在UTF-8问题的迹象.

所以,我想你可以决定使用这样的:

  • 只需使用UTF-8,除非您在编码器和解码器之间存储或传输的方法不是二进制安全的.

  • 否则,请使用数字转义序列.

  • “所有JSON解码器都可以处理UTF-8”确实是正确的。如果某些东西不能接受UTF-8,则它不是JSON解码器。它可能类似于JSON解码器,但绝对不是一个。 (4认同)
  • @DavidSpector 错误的文档 - 您正在查看媒体类型 application/schema+json 的提案,这不是定义 JSON 的地方。当提到编码时,它表示模式的编码与 JSON 中的编码相同,并引用了 JSON 规范:https://tools.ietf.org/html/rfc8259,其中定义 JSON 必须在任何时候使用 UTF-8在封闭的生态系统之外使用。 (2认同)

小智 16

我有一个问题.当我JSON编码带有"é"字符的字符串时,每个浏览器都将返回相同的"é",除了将返回"\ u00e9"的IE.

然后使用PHP json_decode(),如果它找到"é"就会失败,所以对于Firefox,Opera,Safari和Chrome,我要在json_decode()之前调用utf8_encode().

注意:在我的测试中,IE和Firefox使用他们的原生JSON对象,其他浏览器使用json2.js.

  • 可能你的意思是'utf8_encode()`,http://php.net/manual/en/function.utf8-encode.php (10认同)
  • 如果IE无法解码,那么无论您使用什么JSON解码器,它都是一个错误.所有JSON解码器必须成功解码编码形式,否则它们不是JSON解码器.至于json_decode()与é未转义的问题,你输入它的文本可能不是UTF-8.JSON解码器总是假设UTF-8,甚至是PHP实现,即使PHP在许多其他函数中通常不采用UTF-8.还有其他字符编码可以包括一个未转义的屏幕,在屏幕上看起来相同,但不是UTF-8.以\ uXXXX形式编码是一种解决方法. (4认同)

cha*_*aos 12

ASCII不在其中.使用UTF-8编码意味着您不使用ASCII编码.你应该使用转义机制的是RFC所说的:

除了必须转义的字符外,所有Unicode字符都可以放在引号内:引号,反向实线和控制字符(U + 0000到U + 001F)


小智 8

我遇到了同样的问题.这个对我有用.请检查一下.

json_encode($array,JSON_UNESCAPED_UNICODE);
Run Code Online (Sandbox Code Playgroud)


Rem*_*eau 5

阅读 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 文本的实现可能会忽略字节顺序标记的存在,而不是将其视为错误。