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

我正在写一个使用json来表示资源的webservice,而且我有点卡在考虑编码json的最佳方法。 阅读json rfc( http://www.ietf.org/rfc/rfc4627.txt )很清楚,首选编码是utf-8。 但是rfc也描述了一个用于指定字符的string转义机制。 我认为这通常会被用来转义非ASCII字符,从而使得由此产生的utf-8有效的ascii。

假设我有一个包含非ASCII字符(代码点)的jsonstring。 我的web服务应该只是UTF-8编码,并返回它,或者它应该逃脱所有这些非ASCII字符,并返回纯粹的ASCII码?

我希望浏览器能够使用jsonp或eval执行结果。 这是否影响了这个决定? 我对各种浏览器对utf-8的javascript支持的知识缺乏。

编辑:我想澄清,我如何编码结果的主要关注是关于浏览器处理的结果。 我读过的内容表明,当使用JSONP时,浏览器可能对编码敏感。 我还没有find任何关于这个主题的真正的信息,所以我将不得不开始做一些testing,看看会发生什么。 理想情况下,我只想逃避那些需要的字符,只是utf-8编码的结果。

所有的JSONparsing器都可以像JSON规范所要求的那样处理正确的UTF-8以及数字转义序列。

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

数字转义序列的另一个原因是为了防止某些字符出现在数据stream中,比如<&" ,如果JSON代码没有转义成HTML,或者浏览器错误地将其解释为HTML,则可能被解释为HTML序列。这可以防止HTML注入或跨站点脚本(注意:一些字符必须以JSON格式转义,包括"\ )。

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

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

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

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

我在那里遇到了问题。 当我JSON编码string像“é”,每个浏览器将返回相同的“é”,除了IE将返回“\ u00e9”。

然后用PHP json_decode(),如果find“é”就会失败,所以对于Firefox,Opera,Safari和Chrome,我必须在json_decode()之前调用utf8_encode()。

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

ASCII不在其中了。 使用UTF-8编码意味着你没有使用ASCII编码。 RFC应该使用什么逃避机制?

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

我面临同样的问题。 它适用于我。 请检查这个。

 json_encode($array,JSON_UNESCAPED_UNICODE); 

我有一个类似的问题与é字符…我认为评论“这是可能的,你喂它的文本是不是UTF-8”可能接近这里的标志。 我有一种感觉,在我的实例默认sorting规则是其他东西,直到我意识到,并改变为utf8 …问题是数据已经存在,所以不知道如果它转换的数据或不当我改变它,在MySQL中显示罚款工作台。 最终结果是php不会对数据进行json编码,只是返回false。 无论你使用什么浏览器作为服务器导致我的问题,PHP不会parsing数据到UTF8,如果这个字符存在。 就像我说的不知道,如果这是由于在数据存在或只是一个PHP的错误后将架构转换为utf8。 在这种情况下使用json_encode(utf8_encode($string));