servlet在post和get,ajax中收到的字符编码不同的解决方法

我发现在浏览器中使用表单的post和get方法与ajax的post,get方法发给服务器的字符编码居然是不一样的,为了统一起见,做了多次测试,总结了一个可以有效避免各种不同方法发给servlet字符编码不同的解决方法


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html"; charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src = "jquery-2.1.4.js"></script>
</head>
<body>
	<p id=p1>我是中文</p>
	
	<form action="/chinese/servlet/receiveServlet" method=post>
		<input name = username >
		<input type="submit" value="提交">
	</form>
	<a href="/chinese/servlet/receiveServlet?username=form get 新建文件夹">点击使用get方法发送</a>
</body>
<script type="text/javascript">
	var p1 = document.getElementById("p1");
	p1.innerHTML = p1.innerHTML+"新建文件夹";
	console.log("新建文件夹");
	
	
	var ajaxReq;
	ajaxReq = getAjax(); 
	
	ajaxReq.open("post", "/chinese/servlet/receiveServlet",true);
	ajaxReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	ajaxReq.send("username=js post 新建文件夹");
	
	ajaxReq.open("get", "/chinese/servlet/receiveServlet?username=js get 新建文件夹",true);
	//ajaxReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	ajaxReq.send();
	
	$.post("/chinese/servlet/receiveServlet","username=jq post 新建文件夹",function(){
	})
	$.get("/chinese/servlet/receiveServlet","username=jq get 新建文件夹",function(){
	})

function getAjax()
 {
 var xmlHttp;
 
 try
    {
   // Firefox, Opera 8.0+, Safari
    xmlHttp=new XMLHttpRequest();
    return xmlHttp;
    }
 catch (e)
    {

  // Internet Explorer
   try
      {
      xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
      return xmlHttp;
      }
   catch (e)
      {

      try
         {
         xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
         return xmlHttp;
         }
      catch (e)
         {
         alert("您的浏览器不支持AJAX!");
         return false;
         }
      }
    }
 }
 
</script>
</html>


情况1:若不写<meta http-equiv="Content-Type" content="text/html"; charset="UTF-8">这一句,在myeclipse中用utf-8保存后,在浏览器中显示几乎都是乱码,如下:

(火狐浏览器)

鎴戞槸涓枃鏂板缓鏂囦欢澶�

鐐瑰嚮浣跨敤get鏂规硶鍙戦€�

同时console.log打印出的中文也是乱码:鏂板缓鏂囦欢澶�

因为utf-8中,字符串 "新建文件夹"转换成gbk就是 “鏂板缓鏂囦欢澶�” ,所以我们可以判断火狐在没有标明html页面编码格式的情况下,使用window系统的默认编码gbk作为页面的编码

如果加上meta那句话就正常了:

我是中文新建文件夹

点击使用get方法发送

1.1 在不写meta那句话的情况下,使用<form> 的post方法把<input>标签中的输入值发送到servlet,得到的username值是: н¨Îļþ¼Ð,(输入:“新建文件夹”),此返回值的编码格式本人暂时还不清楚;



1.2 在不写meta那句话的情况下,使用<form> 的get方法把<input>标签中的输入值发送到servlet,得到的username值是:鏂板缓鏂囦欢澶�,(输入:“新建文件夹”)此返回值的编码格式本人暂时还不清楚;



1.3 在不写meta那句话的情况下,使用javascript 的ajax的post把<input>标签中的输入值发送到servlet,得到的username值是:鏂板缓鏂囦欢澶�,(输入:“新建文件夹”)这个值是gbk类型



1.4 在不写meta那句话的情况下,使用javascript 的ajax的get把<input>标签中的输入值发送到servlet,得到的username值是:鏂板缓鏂囦欢澶�,(输入:“新建文件夹”),这个值与<form>标签的get方法发出的值相同



1.5 在不写meta那句话的情况下,使用jquery 的ajax的post把<input>标签中的输入值发送到servlet,得到的username值是:鏂板缓鏂囦欢澶�,(输入:“新建文件夹”),这个值与javascript ajax post 发出的值相同;



1.6 在不写meta那句话的情况下,使用jquery 的ajax的get把<input>标签中的输入值发送到servlet,得到的username值是:鏂板缓鏂囦欢澶�,,(输入:“新建文件夹”),这个值与javascript ajax get ,还有<form>标签get发出的值相同;



情况二:在<head>标签中写上<meta http-equiv="Content-Type" content="text/html"; charset="UTF-8">这一句


2.1 有meta这一句时:使用<form> 的post方法把<input>标签中的输入值发送到servlet,得到的username值是:新建文件夹 ,(输入:“新建文件夹”),这个值是utf-8 “新建文件夹”以iso-8859-1 转化后的值



2.2 有meta这一句时:使用<form> 的get方法把<input>标签中的输入值发送到servlet,得到的username值是:新建文件夹,(输入:“新建文件夹”),与post方法得到值相同,也是iso-8859-1编码。



2.3 有meta这一句时,使用javascript 的ajax的post把<input>标签中的输入值发送到servlet,得到的username值是:新建文件夹,(输入:“新建文件夹”),完美的收到了输入值。



2.4 有meta这一句时,使用javascript 的ajax的get把<input>标签中的输入值发送到servlet,得到的username值是:新建文件夹,(输入:“新建文件夹”),与<form>的get相同,是iso-8859-1编码。



2.5 有meta这一句时,使用jquery 的ajax的post把<input>标签中的输入值发送到servlet,得到的username值是: 新建文件夹,(输入:“新建文件夹”),完美的收到了输入值。



2.6 有meta这一句时,使用jquery 的ajax的post把<input>标签中的输入值发送到servlet,得到的username值是: 新建文件夹,(输入:“新建文件夹”)与<form>的get得到的值相同,是iso-8859-1编码。




综上,<meta http-equiv="Content-Type" content="text/html"; charset="UTF-8">这一句话非常重要,如果没有这一句,浏览器发出去的字符串就不能确定是什么编码,而如果写上这一句,由于<form>的post和get都是按照iso-8859-1编码,js和jquery的ajax get方法也用iso-8859-1编码,而且只有他们两个的post方法是utf-8编码,所以为了方便起见,可以再servlet中加上一句 request.getCharactorEncoding("iso-8859-1");将所有传来的参数字符串都按照iso-8859-1编码(utf-8也会默认转换成iso-8859-1),然后在获得parameter时,使用 String username = new String(request.getParameter("username").getBytes("iso-8859-1"),"utf-8"); 将获得的参数转换为java的utf-8编码.本人亲测,这样设置之后就可以有效避免不同传中文乱码的情况




servlet的源码如下

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class receiveServlet extends HttpServlet {

	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("收到get请求");
		String username = new String(request.getParameter("username").getBytes("iso-8859-1"),"utf-8");
		System.out.println(username);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("iso-8859-1");
		System.out.println("收到post请求");
		String username = new String(request.getParameter("username").getBytes("iso-8859-1"),"utf-8");
		System.out.println(username);
	}

}

效果如下:

收到post请求
js post 新建文件夹


收到get请求
jq get 新建文件夹


收到post请求
jq post 新建文件夹

收到post请求
form post 新建文件夹


收到get请求
js get 新建文件夹


收到get请求
form get 新建文件夹


收到get请求
form get 新建文件夹


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值