ajax中与PHP json_encode中全为gb2312乱码最终解决方案
先说一下我的情况:
1,HTML是GBK,JS是写在HTML里,PHP也是GBK2312,php的header头和html的头部都指名了gb2312,当然文档也全是
gb2312,这样还是一样的乱码。
2,情况分析。
测试半天,如果在php里不用json_encode的话,用print_r或var_dump都正常不乱码,就是用json_encode才乱码。这是
因为json_encode转换时只认utf-8的。知道问题出在哪,就有办法解决的了!
3,解决方法
既然问题出在PHP这边,那我们的PHP文档都是GB2312的,这样只好在使用json_encode前把我们的数组GBK全转换成UTF
-8的咯。转换后就不乱了,这样我们再把返回的头设置成GB2312即可了!
贴一下我的代码:
PHP代码如下:
复制代码
HTML代码是空的,只有一个JS代码
JS如下:
复制代码
说明:
foreach($rs as $ke=>$val){
$rs[$ke]['goods_name'] = iconv('gb2312','utf-8',$val['goods_name']);
}
这句就是把当前的数组中的有中文字的字段从GB2312全转为utf-8
然后后面就再json_encode来转换就不会乱码了!
全部代码如上,发下贴子,留着以后自己看看,也希望能帮到新人!
先说一下我的情况:
1,HTML是GBK,JS是写在HTML里,PHP也是GBK2312,php的header头和html的头部都指名了gb2312,当然文档也全是
gb2312,这样还是一样的乱码。
2,情况分析。
测试半天,如果在php里不用json_encode的话,用print_r或var_dump都正常不乱码,就是用json_encode才乱码。这是
因为json_encode转换时只认utf-8的。知道问题出在哪,就有办法解决的了!
3,解决方法
既然问题出在PHP这边,那我们的PHP文档都是GB2312的,这样只好在使用json_encode前把我们的数组GBK全转换成UTF
-8的咯。转换后就不乱了,这样我们再把返回的头设置成GB2312即可了!
贴一下我的代码:
PHP代码如下:
- <?php
- //我是拿ecshop测试
- $con = mysql_connect("localhost","root","") or die("数据库链接出错 ,错误信息:").mysql_errno();
- mysql_query("set names gb2312");
- mysql_select_db("ecshop");
- $res = mysql_query("select goods_name,goods_sn,goods_id from ecs_goods limit 10");
- while ($row = mysql_fetch_array($res)){
- $rs[]=$row;
- }
- foreach($rs as $ke=>$val){
- $rs[$ke]['goods_name'] = iconv('gb2312','utf-8',$val['goods_name']);
- }
- header("Content-Type: text/html; charset=gb2312");
- echo json_encode($rs);
- ?>
HTML代码是空的,只有一个JS代码
JS如下:
- <script type="text/javascript" >
- var xhr = CreatXHR();
- xhr.open("get","http://127.0.0.1/test.php?"+Math.random(),true);
- xhr.onreadystatechange = function(){
- if(xhr.readyState ==4 && (xhr.status ==200 || xhr.status ==0)){
- var text = eval("["+xhr.responseText+"]");
- for(var i=0;i<text[0].length;i++){
- alert(text[0][i].goods_name)
- }
- //console.dir(text)
- }
- }
- xhr.send();
- function CreatXHR(){
- return window.XMLHttpRequest ? new XMLHttpRequest(): new ActiveXObject
- ("Microsoft.XMLHTTP");
-
- }
- </script>
说明:
foreach($rs as $ke=>$val){
$rs[$ke]['goods_name'] = iconv('gb2312','utf-8',$val['goods_name']);
}
这句就是把当前的数组中的有中文字的字段从GB2312全转为utf-8
然后后面就再json_encode来转换就不会乱码了!
全部代码如上,发下贴子,留着以后自己看看,也希望能帮到新人!