php与ajax交互中文乱码(字符串转化)

一.从后台传过来的json不做处理,前端result.name这样调用回乱码。应该使用urldecode将jsonencod转码

注意json只接受utf-8编码的字符,所以json_encode()的参数必须是utf-8编码,否则会得到空字符或者null。

后台:

if(!empty($chatData)){

echo urldecode(json_encode($chatData));

  1. <?php  
  2.     $testJSON=array('name'=>'中文字符串','value'=>'test');  
  3.     //echo json_encode($testJSON);  
  4.     foreach ( $testJSON as $key => $value ) {  
  5.         $testJSON[$key] = urlencode ( $value );  
  6.     }  
  7.     echo urldecode ( json_encode ( $testJSON ) );  
  8. ?>  

查看输出结果为:

{“name”:”中文字符串”,”value”:”test”}

 二.前台ajax传递至后台

1.

$.ajax({
url:url,
type:"POST",
data:data,
contentType:"application/x-www-form-urlencoded; charset=utf-8",
dataType:"json",
success: function(){
...
}
})

2.使用:encodeURIComponent 做字符转换

解决方法
1,保持编码的统一,包括文件编码,数据库编码,网页content-type编码
检查一下<meta http-equiv=”content-type” content=”text/html; charset=UTF-8″ />
建议中文都是用UTF-8,使用gbk/gb2312有可能会出现乱码
2,使用post来发送而不是get
get方法是会通过链接来传递参数,而且会自动urlEncode(编码),而各个浏览器编码的方式可能不太一样。使用post可以避免这种情况。
3,通过在js前端escape编码再发送,然后后台解码取得数据( decodeURI()或者decodeURIComponent() )
decodeURIComponent() 函数可对 encodeURIComponent() 函数编码的 URI 进行解码。


4,在全局设定contentType,指定编码
因为jquery ajax是使用utf-8来编码发送数据的,ie在发送时却没加上charset=utf-8,从而导致乱码(IE默认使用iso-8859-1编码)

实例1:

<script type="text/javascript">
  var test1="http://www.w3school.com.cn/My first/"
  document.write(encodeURIComponent(test1)+ "<br />")
  document.write(decodeURIComponent(test1))
</script>

输出:

http%3A%2F%2Fwww.w3school.com.cn%2FMy%20first%2F
http://www.w3school.com.cn/My first/

实例2:

.ajax({
type:"get",
cache:false,
contentType:"application/x-www-form-urlencoded:charset=UTF-8",
url:"ajaxpage.aspx?t=smrz&name="+escape(name)+"&zjtype="+escape(type)+"&zjnum="+escape(zjnum)+"",
dataType:"json",
success:function(data){
alert(data.info);
}
})

三.顶层函数(全局函数)

函数描述
decodeURI() 解码某个编码的 URI。
decodeURIComponent() 解码一个编码的 URI 组件。
encodeURI() 把字符串编码为 URI。
encodeURIComponent() 把字符串编码为 URI 组件。
escape() 对字符串进行编码。
eval() 计算 JavaScript 字符串,并把它作为脚本代码来执行。
getClass() 返回一个 JavaObject 的 JavaClass。
isFinite() 检查某个值是否为有穷大的数。
isNaN() 检查某个值是否是数字。
Number() 把对象的值转换为数字。
parseFloat() 解析一个字符串并返回一个浮点数。
parseInt() 解析一个字符串并返回一个整数。
String() 把对象的值转换为字符串。
unescape() 对由 escape() 编码的字符串进行解码。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/peng14/p/3631124.html