当前位置: 首页 > 面试题库 >

参考:为什么我的“特殊” Unicode字符使用json_encode奇怪地编码?

颛孙钱青
2023-03-14
问题内容

当使用“特殊” Unicode字符时,当编码为JSON时,它们作为奇怪的垃圾出现:

php > echo json_encode(['foo' => '馬']);
{"foo":"\u99ac"}

为什么?我的编码做错了吗?

(这是一劳永逸地澄清该主题的参考问题,因为这是一遍又一遍的。)


问题答案:

首先: 这里没有错。 这就是 可以 在JSON中编码字符的 方式 。它是官方
标准。它基于如何在 Javascript
ECMAScript(第7.8.4节“字符串文字”)中形成字符串文字的方式,其描述如下:

任何代码点都可以表示为十六进制数。此数字的含义由ISO / IEC 10646确定。如果代码点位于基本多语言平面(U + 0000至U +
FFFF)中,则可以将其表示为六个字符的序列:反向固线,后跟小写字母u,然后是对代码点进行编码的四个十六进制数字。[…]例如,仅包含单个反斜线字符的字符串可以表示为“
\ u005C”。

简而言之:任何字符都可以编码为\u....,其中....字符的Unicode代码点(对于BMP之外的字符,则为UTF-16代理对的一半的代码点)。

"馬"
"\u99ac"

这两个字符串文字代表完全相同的字符,它们是绝对等价的。当这些字符串文字由兼容的JSON解析器解析时,它们都将产生字符串“马”。它们 看起来
并不相同,但是它们在JSON数据编码格式中的 含义 相同。

PHP
json_encode最好使用\u....转义序列对非ASCII字符进行编码。从技术上讲,它不是必须的,但确实如此。结果是完全正确的。如果您希望在JSON中使用文字字符而不是转义序列,则可以JSON_UNESCAPED_UNICODE在PHP
5.4或更高版本中设置标志:

php > echo json_encode(['foo' => '馬'], JSON_UNESCAPED_UNICODE);
{"foo":"馬"}

需要强调的是:这只是一个 首选项 ,以任何方式都不需要在JSON中传输“ Unicode字符”。



 类似资料:
  • 问题内容: 使用json_encode对数组进行编码时,包含特殊字符的数组元素将转换为空字符串: JSON编码后,元素[funds]为空。它只能使用特殊字符(如版权,商标等)进行,例如“ ComStageSTOXX®Europe600 Techn NR ETF”中的那些。 有什么建议么? 谢谢 更新:这是在填充数组之前解决问题的原因(所有名称均取自数据库): 问题答案: 您的输入必须编码为UTF-

  • 相关网站:http://nubix.ca/blog/we-have-a-drone-and-were-prepared-to-shot/

  • 问题内容: 这是代码片段: 输出为: 为什么会这样呢?我认为是,要么,或。 这里发生了什么? 问题答案: 二是算术加法,不是字符串连接。您必须执行或之类的操作,或使用和方法来确保操作符中的至少一个是用于字符串串联的运算符。 [JLS 15.18加法运算符](http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#

  • 我正在编写一个DocumentFilter,它将输入JTextField的所有单词“top”替换为逻辑top符号。 使用此代码很好,但是它很烦人,因为用户必须重新键入他们的空间,他们可以这样做,并且文本继续在同一行上 当用户继续键入文本时,使用此代码并在空格中添加替换符会导致顶部符号和JTextField中的所有文本稍微向上推,然后转到下面并开始一行新的内容 有人能解释一下这种行为,并希望能提供一

  • 我有一个问题,下载文件有特殊字符在它像"ñ"或"的"。 我正在对每个文件名应用rawurlencode()。但是当我走上这条路线时,apache正在重写我的url。 当我检查a标签中的href时,我得到了正确的URL编码路由,如下图所示。 带有编码url的标记 但是当我点击链接时,编码的数据丢失了 点击链接后丢失编码 这里是我的apache配置

  • 特殊变量是由FreeMarker引擎自己定义的变量。要访问它们, 你可以使用 .variable_name 语法。 比如,你不能仅仅写 version,而必须写.version。 Note: 在 FreeMarker 2.3.23 版本中,可以使用驼峰格式的特殊变量名来代替蛇形格式, 比如 dataModel 代替 data_model。 但是需要知道在相同的模板中,FreeMarker 会对模板