我的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”?
非常感谢。
答案 0 :(得分:41)
json_encode()
实际上并没有输出JSON *。它正在输出一个javascript字符串。 (当你给它一个对象或数组进行编码时,它会输出JSON。)这很好,因为javascript字符串就是你想要的。
在javascript(和JSON中)中,č
可能会转义为\u010
。两者是等价的。所以json_encode()
正在做什么并没有错。它应该工作正常。如果这实际上导致您遇到任何形式的问题,我会感到非常惊讶。但是,如果传输安全地采用Unicode编码(通常为UTF-8)†,则也不需要它。如果你想关闭转义,你可以这样做:json_encode('Svrček', JSON_UNESCAPED_UNICODE)
。请注意,标志JSON_UNESCAPED_UNICODE
是在PHP 5.4.0中引入的,在早期版本中不可用。
顺便说一句,与@onteria_所说的相反,JSON does use UTF-8:
JSON文本的字符编码始终是Unicode。 UTF-8是唯一在线上有意义的编码,但也允许使用UTF-16和UTF-32。
*或者,至少,它没有按照RFC 4627中的定义输出JSON。但是,有other definitions of JSON scalar values are allowed。
†JSON可能是UTF-8,UTF-16LE,UTF-16BE,UFT-32LE或UTF-32BE。
答案 1 :(得分:10)
好的,所以,在你的php脚本中建立数据库连接之后,把它放到这一行,它应该可以工作,至少它解决了我的问题:
mysql_query('SET CHARACTER SET utf8');
答案 2 :(得分: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 NOT UTF-8。此FAQ解释了UTF-8和Unicode之间的区别:
http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
您使用JSON,您的非ascii字符将转义为Unicode代码点。例如こ = code point 3053。