是PHP';s json_编码保证生成ASCII字符串?

是PHP';s json_编码保证生成ASCII字符串?,php,utf-8,json,Php,Utf 8,Json,好吧,主题说明了一切。我正在使用json_encode将一些UTF8数据转换为json,我需要将其传输到当前仅为ASCII的某个层。所以我想知道我是否需要让它知道UTF-8,或者我可以让它保持原样 查看JSON rfc,UTF8在JSON输出中也是有效的字符集,但不推荐使用,即某些实现可能会将UTF8数据留在内部。问题是PHP的实现是将所有内容转储为ASCII还是选择将某些内容保留为UTF-8。那么,json\u encode返回一个字符串。根据报告: 字符串是一系列字符。在PHP6之前,字符与

好吧,主题说明了一切。我正在使用json_encode将一些UTF8数据转换为json,我需要将其传输到当前仅为ASCII的某个层。所以我想知道我是否需要让它知道UTF-8,或者我可以让它保持原样


查看JSON rfc,UTF8在JSON输出中也是有效的字符集,但不推荐使用,即某些实现可能会将UTF8数据留在内部。问题是PHP的实现是将所有内容转储为ASCII还是选择将某些内容保留为UTF-8。

那么,
json\u encode
返回一个字符串。根据报告:

字符串是一系列字符。在PHP6之前,字符与字节相同。也就是说,可能有256个不同的字符。这也意味着PHP不支持Unicode。有关一些基本的Unicode功能,请参见utf8_encode()和utf8_decode()


因此,目前您无需担心UTF-8的识别问题。当然,您可能仍然需要考虑这一点,以便将来验证您的代码。

根据中的JSON文章,字符串中的Unicode字符总是

带反斜杠转义的双引号Unicode

PHP手册中关于
json\u encode()
的示例似乎证实了这一点

因此,ASCII/ANSI之外的任何UTF-8字符都应该像这样转义:
\u0027
(注意,正如@Ignacio在评论中指出的,这是推荐的处理这些字符的方法,而不是必需的方法)

但是,我想
json\u decode()
会将字符转换回字节值吗?你可能会在那里遇到麻烦


如果您需要确定,请先查看一下可以将UTF-8字符串转换为ASCII(删除任何不支持的字符)的功能。

与中的JSON支持不同,
JSON_encode()
无法生成ASCII以外的任何内容。

我不想删除不支持的字符。我需要保存它们。@Milan然后你应该确保它们以
\u0027
的形式保存。等一下,我会检查一下我是否能找到这样做的方法。在RFC 4627第3节“编码”中:“JSON文本应该用Unicode编码。默认编码是UTF-8。”仅仅因为可以使用Unicode转义并不意味着它们是必需的。@米兰我只记得一个类似的问题:如何转换上传文件的名称(可能包含任何UTF-8字符),因此它们可以存储在本地文件系统中,而不管系统支持什么字符集。有人提出的一个很好的解决方案是
urlencode()
ing字符串。这将保留所有UTF-8字符(别忘了指定编码)但是可以很容易地存储在ASCII中。解码是一个简单的
urldecode()
。这有帮助吗?只是为了澄清一下,在撰写本文时,PHPs
json\u encode
将转义您所关心的非ASCII字符。虽然json可以很好地容纳UTF-8字符,但PHPs实现目前会转义它们。我不能使用utf8\u编码和_解码,因为PHP不在另一端。我需要将数据从PHP转储到JSON,通过一个只理解ASCII的层传递,最后通过目标上的JavaScript将其用作。除非JavaScript具有与PHP相同的utf8函数,否则无法使用。@Milan可以获得
urldecode()在JS中,如果你能忍受33%个膨胀,考虑BASE64编码。@ Ignacio Vazquez Abrams:不,我的意思是未来:-谢谢伊格纳西奥,这是我正在寻找的答案。你能提供一些网站或其他参考来支持这一点吗?我不能。我所能做的就是指出
json\u encode()
中没有参数或选项来生成任何其他内容。现在,使用
json\u UNESCAPED\u UNICODE
标志,它实际上是这样做的。我们可能可以检查php的源代码来确定