epi*_*i82 17 php json utf-8 character-encoding
我的json_encode函数有特殊字符的问题.
例如,我试试这个:
$string="Svr?ek";
echo "ENCODING=".mb_detect_encoding($string); //ENCODING=UTF-8
echo "JSON=".json_encode($string); //JSON="Svr\u010dek"
Run Code Online (Sandbox Code Playgroud)
如何正确显示字符串,JSON ="Svrček"?
非常感谢你.
TRi*_*RiG 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 确实使用了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.
Vul*_*sin 11
好的,所以,在你的PHP脚本中建立数据库连接之后,把它放在这一行,它应该工作,至少它解决了我的问题:
mysql_query('SET CHARACTER SET utf8');
Run Code Online (Sandbox Code Playgroud)
是的,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";
Run Code Online (Sandbox Code Playgroud)
输出:
ENCODING: UTF-8
ENCODED JSON: "\u3053\u3093\u306b\u3061\u306f"
DECODED JSON: ?????
Run Code Online (Sandbox Code Playgroud)
编辑:没什么值得的:
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代码点.例如,こ=代码点3053.
| 归档时间: |
|
| 查看次数: |
65386 次 |
| 最近记录: |