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 新建文件夹


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值