我使用Ajax传数据常常遇到乱码问题,前端和后台后有可能出现,下面总结一下Ajax传数据可能遇到的问题和解决方案,任何一点都可能造成乱码问题。我使用java servlet写后台,ajax传数据
1.检查IDE的编码,
eclipse:
项目,右键,properties->resource->other 选择utf-8
webstorm: 右下角
2.,在html中meta标签和script标签
<meta charset="utf-8">
当前面pageEncoding和contentType都没有设置的情况下,被解析成的html页面就会采用这种编码方式。来把byte解析成浏览器显示的信息。
<script type="text/javascript" src="js/login.js" charset="utf-8"></script>
3.客户端:ajax传数据的时候,设置请求头的编码
(1)get提交
对于这种,影响的有tomcat的URIEncoding;
浏览器会根据自己的页面的编码格式作为起始编码格式,
(2)post提交
对于这种情况,response.setCharacterEncoding有影响,当没有对response.setCharacterEncoding设置的时候值为null,则默认采用iso-8859-1来进行重新编码(解码)。解决方案看第5点
$.ajax({
type: "post",
url: "http://localhost:8080/EasternAirlines/loginjudger",
data: {},
dataType: "jsonp",
jsonpCallback:"user",
scriptCharset : 'utf-8',//这两个地方的编码
contentType: "application/x-www-form-urlencoded; charset=UTF-8",//有的浏览器没有默认,firefox和google、ie浏览器就不一样
success: function(data){
console.log(data);
login_state(data);
},
error:function(data){
alert(data.status);
alert("失败");
}
});
4.服务器:设置请求和响应的字符编码为utf-8,设置请求头接收的编码是utf-8,请求头和ajax里的请求头对应。BufferedWriter处一定要写在设置各种编码的下面,否则不起作用(此处坑了我好多时间)
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=UTF-8");
writer = new BufferedWriter(resp.getWriter());//此处必须写在上面几句话的下面
5.后台:jsonp传数据一般是iso-8859-1编码,所以在后台你需要对默认编码转成utf-8编码,就可以了
String user= new String(req.getParameter("user").getBytes("iso-8859-1"),"UTF-8");
6.后台一般会有操作数据库的操作,如果从数据库里读取的数据就是乱码的,传到前端肯定是乱码的,数据库也有一些地方要注意编码,我使用JDBC操作数据库
(1)在写URL的时候注意编码:
private static final String url = "jdbc:mysql://localhost:3306/airplane?useUnicode=true&characterEncoding=UTF-8";
(2)数据库表当然也得都是utf-8的