我正在编写一个使用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进行编码即可.
正如JSON规范所要求的那样,所有JSON解析器都可以处理正确的UTF-8以及数字转义序列.
JSON编码器使用数字转义序列的能力只是为您提供了更多选择.您可以选择数字转义序列的一个原因是编码器和目标解码器之间的传输机制不是二进制安全的.
你可能想要使用数字转义序列的另一个原因是为了防止出现在流中的某些字符,例如<
,&
和"
,如果JSON代码被置于不逃逸到HTML或浏览器错误地将其解释为HTML,其可被解释为HTML序列.这可以防止HTML注入或跨站点脚本(注意:一些字符必须在JSON中转义,包括"
和\
).
一些框架,包括PHP的JSON实现,总是在编码器端为ASCII以外的任何字符执行数字转义序列.这旨在最大限度地兼容有限的传输机制等.但是,这不应被解释为JSON解码器存在UTF-8问题的迹象.
所以,我想你可以决定使用这样的:
只需使用UTF-8,除非您在编码器和解码器之间存储或传输的方法不是二进制安全的.
否则,请使用数字转义序列.
我有一个问题.当我JSON编码带有"é"字符的字符串时,每个浏览器都将返回相同的"é",除了将返回"\ u00e9"的IE.
然后使用PHP json_decode(),如果它找到"é"就会失败,所以对于Firefox,Opera,Safari和Chrome,我要在json_decode()之前调用utf8_encode().
注意:在我的测试中,IE和Firefox使用他们的原生JSON对象,其他浏览器使用json2.js.
ASCII不在其中.使用UTF-8编码意味着您不使用ASCII编码.你应该使用转义机制的是RFC所说的:
除了必须转义的字符外,所有Unicode字符都可以放在引号内:引号,反向实线和控制字符(U + 0000到U + 001F)
我遇到了同样的问题.这个对我有用.请检查一下.
json_encode($array,JSON_UNESCAPED_UNICODE);