我在使用json_encode函数处理特殊字符时遇到了问题。
比如说,我尝试了以下代码:
$string="Svrček";
echo "ENCODING=".mb_detect_encoding($string); //ENCODING=UTF-8
echo "JSON=".json_encode($string); //JSON="Svr\u010dek"
我应该怎么做才能正确显示字符串 JSON="Svrček"?
非常感谢。
我在使用json_encode函数处理特殊字符时遇到了问题。
比如说,我尝试了以下代码:
$string="Svrček";
echo "ENCODING=".mb_detect_encoding($string); //ENCODING=UTF-8
echo "JSON=".json_encode($string); //JSON="Svr\u010dek"
我应该怎么做才能正确显示字符串 JSON="Svrček"?
非常感谢。
json_encode()
实际上输出的不是 JSON*。它输出的是一个 javascript 字符串。(当你给它一个对象或数组进行编码时,它才会输出 JSON)。这没问题,因为你需要的是一个javascript字符串。
在javascript(和JSON中),č
可以被转义为 \u010d
。两者是等价的。所以 json_encode()
的行为没有问题。它应该能够正常工作。但是如果传输安全地在Unicode编码(通常是UTF-8)†下进行,则没有必要进行转义。如果你想关闭转义,可以这样做:json_encode('Svrček',JSON_UNESCAPED_UNICODE)
。请注意,标志 JSON_UNESCAPED_UNICODE
在PHP 5.4.0中引入,并且在早期版本中不可用。
顺便说一句,与 @onteria_ 所说的相反,JSON确实使用UTF-8:
JSON文本的字符编码始终为Unicode。UTF-8是在网络上传输时唯一有意义的编码,但也允许使用UTF-16和UTF-32。
* 或者至少,它没有按照RFC 4627定义的输出JSON。但是,有其他的JSON定义,其中允许标量值。
† JSON可以使用UTF-8,UTF-16LE,UTF-16BE,UFT-32LE或UTF-32BE编码。
JSON_UNESCAPED_UNICODE
的版本。然而,正如我之前所说,转义版本完全有效,不应该引起任何问题。我很好奇为什么有人需要这样做。 - TRiGjson_encode
不会发出转义的Unicode代码点。例如,json_encode('Hello José ")
会产生可怕的"Hello Jos\u00e9 \ud83d\ude31"
。U+D83D和U+DE31不是合法的Unicode代码点。因此,它正在发出可怕的UTF-16代码单元。它在混淆逻辑代码点与物理编码布局方面犯了错误,在Java、C#和Windows等地方反复看到这种抽象违规。 - tchrist好的,所以,在您的PHP脚本中进行数据库连接后,请添加此行代码,它应该可以正常工作,至少解决了我的问题:
Ok,所以,在您的php脚本中建立数据库连接之后,请添加这行代码,它应该可以正常工作,至少它解决了我的问题:
mysql_query('SET CHARACTER SET utf8');
是的,json_encode
会转义非ascii字符。如果你解码它,你将得到你的原始结果:
$string="こんにちは";
echo "ENCODING: " . mb_detect_encoding($string) . "\n";
$encoded = json_encode($string);
echo "ENCODED JSON: $encoded\n";
$decoded = json_decode($encoded);
echo "DECODED JSON: $decoded\n";
输出:
ENCODING: UTF-8
ENCODED JSON: "\u3053\u3093\u306b\u3061\u306f"
DECODED JSON: こんにちは
编辑:值得注意的是:
JSON 仅使用 Unicode。
这是一种自我记录结构和字段名称以及特定值的格式;
来源:http://www.json.org/fatfree.html
它使用的是 Unicode,而不是 UTF-8。本 FAQ 解释了 UTF-8 和 Unicode 之间的区别:http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
如果您使用 JSON,则非 ASCII 字符将被转义为 Unicode 代码点。例如:こ = 代码点 3053。