问题json_encode utf-8

时间:2011-05-19 12:14:25

标签: php utf-8 character-encoding json

我的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”?

非常感谢。

3 个答案:

答案 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