参考:为什么我的 特别"?使用 json_encode 编码奇怪的 Unicode 字符?

本教程将介绍参考:为什么我的“特别"?使用 json_encode 编码奇怪的 Unicode 字符?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

参考:为什么我的 特别"?使用 json_encode 编码奇怪的 Unicode 字符? 教程 第1张

问题描述

当使用特殊"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代码点(或代码UTF-16 代理对的一半的点,用于 BMP 之外的字符).

"馬"
"u99ac"

这两个字符串字面量代表完全相同的字符,它们是绝对等价的.当这些字符串文字由兼容的 JSON 解析器解析时,它们都会产生字符串马".它们不同,但它们在 JSON 数据编码格式中相同.

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

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

强调一下:这只是一个偏好,没有必要以任何方式在 JSON 中传输Unicode 字符".

好了关于参考:为什么我的“特别"?使用 json_encode 编码奇怪的 Unicode 字符?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。