几乎学习什么技术都会牵扯到这个问题,中文乱码问题,在Ajax中也不例外,下面我们来说一下在Ajax中解决中文
乱码的问题。一般情况下会使用new String(text.getBytes("ISO-8858-1"),"UTF-8"),但是有时候这种方法在Ajax中不是通
用的,偶尔会出现问题,我们来说一种通用的终极解决办法。
首先是界面端的代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>ajax.html</title>
<script type="text/javascript" src="/Ajax/js/jquery-1.7.2.js"></script>
<script type="text/javascript">
function test(){
//1.获取文本框中的值
var value = $("#userName").val();
//2.将文本框中的内容发送给后台服务器
var url = "/Ajax/servlet/AjaxServlet?name="+value;
url = convertURL(url);
url = encodeURI(encodeURI(url));
$.get(url,null,callback);
}
//给url地址增加时间戳,骗过浏览器,不读去缓存
function convertURL(url){
var timestmp = (new Date()).valueOf();
//将时间戳追加到url上面
url = url+ "&t=" +timestmp;
return url;
}
function callback(data){//回调函数
//3.接受服务器的返回的数据
//alert(data);
//4.将结果显示在页面中
$("#div1").html(data);
}
</script>
</head>
<body>
用户名:<input type="text" id="userName" οnblur="test();"/><span id="div1" style="color: red"></span>
<br/>
密码:<input type="password" id="password" /><br/>
邮箱:<input type="text" id="mail" />
</body>
</html>
请密切注意这一句
url = encodeURI(encodeURI(url));这句话把url 进行编码了两次,第一次把中文编码为utf-8的百分号的那种形式,然后再把这些
UTF-8编码完成的字节码再次进行编码,这样是对那些字符或者英文进行编码,绝对不会出现问题,下面我们再来看一下后台的servlet的代码
package com.bird.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AjaxServlet extends HttpServlet {
/**
* 获取前台传递过来的参数
*/
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String name = request.getParameter("name");
// name = new String(name.getBytes("ISO-8859-1"),"UTF-8");
name=URLDecoder.decode(name, "UTF-8");
PrintWriter out = response.getWriter();
System.out.println(name);
if(name.equals("陈显鹭")){
out.println("用户名"+name+"已经存在");
}else{
out.println("用户名"+name+"不存在,可以使用");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
注意这局
name=URLDecoder.decode(name, "UTF-8");
当服务器得到数据的时候会进行一次转码,然后另外一次转码我们显示的指定转码的方式,这样就能介君乱码问题了。