问题:json_encode utf-8

18

我在使用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"?

非常感谢。


这是哪种语言?我以为是Perl,但现在我想可能是PHP? - hippietrail
"Svr\u010dek" 相当于 "Svrček"(UTF-8)。 - Gumbo
1
重复:https://dev59.com/yGw15IYBdhLWcg3wMY2L。 - TRiG
3个回答

45

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编码。


4
+1 for JSON_UNESCAPED_UNICODE - bizzr3
是的,我需要它,并且我正在使用UTF-8。问题是关于转义Unicode以返回实际字符。虽然我已经找到了解决方案。谢谢和干杯。 - Muhammad Babar
你最好的选择,@Ted,是升级PHP到支持JSON_UNESCAPED_UNICODE的版本。然而,正如我之前所说,转义版本完全有效,不应该引起任何问题。我很好奇为什么有人需要这样做。 - TRiG
2
请注意,json_encode不会发出转义的Unicode代码点。例如,json_encode('Hello José ")会产生可怕的"Hello Jos\u00e9 \ud83d\ude31"。U+D83D和U+DE31不是合法的Unicode代码点。因此,它正在发出可怕的UTF-16代码单元。它在混淆逻辑代码点与物理编码布局方面犯了错误,在Java、C#和Windows等地方反复看到这种抽象违规。 - tchrist
@tchrist。相关问题 - TRiG
显示剩余5条评论

11

好的,所以,在您的PHP脚本中进行数据库连接后,请添加此行代码,它应该可以正常工作,至少解决了我的问题:

Ok,所以,在您的php脚本中建立数据库连接之后,请添加这行代码,它应该可以正常工作,至少它解决了我的问题:

mysql_query('SET CHARACTER SET utf8');

7

是的,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


3
不正确。JSON确实使用UTF-8 - TRiG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接