在GBK下如何处理JSON的中文信息

来源:百度知道 编辑:UC知道 时间:2024/05/04 07:00:07
请不要复制粘贴大篇幅的参考资料,这很无聊!

问题是这样的:

正在做一个项目,要求编码是GBK的,但是其中打量用到 jQuery来做AJAX传输,数据类型为JSON的~~

大家都知道,JSON不支持GBK的编码,必须把GBK先转化为UTF-8来传输。
因此,我用了下面的函数来模拟javascript中的escape,在接收端的页面中用javascript的unescape来还原中文。

escape的自定义函数如下:

function escape($str){
preg_match_all("/[\xc2-\xdf][\x80-\xbf]+|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}|[\x01-\x7f]+/e",$str,$r);
$str = $r[0];
$l = count($str);
for($i=0; $i <$l; $i++){
$value = ord($str[$i][0]);
if($value < 223){
$str[$i] = rawurlencode(utf8_decode($str[$i]));
} else {
$str[$i] = "%u".strtoupper(bin2hex(iconv("UTF-8","UCS-2",$str[$i])));
}
}
return join("",$str);
}

但是显示的结果还是乱码。。。。
请高手解答

首先说一点,解决利用AJAX出现乱码的终极解决办法就是设置header里的Content-Type的charset,保证浏览器以你指定的编码识别。
例如: header("Content-Type: text/html; charset=GBK");

推荐用Services_JSON来编码JSON。Services_JSON对php版本没有要求,但是也不支持gbk编码的中文。
Services_JSON源程序中把中文字符转码为十六进制,完全没有必要。直接显示就好了。
修改Services_JSON 的源码:

在 255 行 ( case 'string': 下一行),加上
return "'".str_replace(array("\n","\r","'"),array("
","","\'"),htmlspecialchars($var))."'";

记的输出前加上:
header("Content-Type: text/html; charset=GBK");

晴天了

escape不是用来处理编码的吧?!!! escape仅仅是把中文变成ascall而已,具体编码并没有改变;
就好比你看到一段中文,这段中文可能是以utf-8编码,也可以是以gbk编码,但是你看到的都是可识别的中文;
所以你应该在服务器端先检测你字符串的编码类型,如果是gb2312或者gbk则转化为utf-8个jquery处理即可,具体到客户端了浏览器会根据你页面设置的编码来显示。