Contents
  1. 1. 提交数据中文乱码问题总结:
    1. 1.1. 1.如果提交方式为post,想不乱码,只需要设置request对象的编码即可。
    2. 1.2. 2.如果提交方式为get,设置request对象的编码是无效的,想不乱码,只能手工转换。
    3. 1.3. 3.以超链接形式传递中文参数的乱码问题
    4. 1.4. 4. cookie中存取中文
    5. 1.5. 建议:

参考:

提交数据中文乱码问题总结:

1.如果提交方式为post,想不乱码,只需要设置request对象的编码即可。

  注意:客户机数据是以哪种方式提交的,request就应该设成什么编码。
之所以会产生乱码,就是因为服务器和客户端沟通的编码不一致造成的,因此解决的办法是:在客户端和服务器之间设置一个统一的编码,之后就按照此编码进行数据的传输和接收。

  由于客户端是以UTF-8字符编码将表单数据传输到服务器端的,因此服务器也需要设置以UTF-8字符编码进行接收,要想完成此操作,服务器可以直接使用从ServletRequest接口继承而来的”setCharacterEncoding(charset)”方法进行统一的编码设置。

常用代码:

1
2
3
4
5
6
7
//客户端是以UTF-8编码,post方法提交表单数据的,所以需要设置服务器端以UTF-8的编码进行接收,否则对于中文数据就会产生乱码
request.setCharacterEncoding("UTF-8");

//设置服务器端以UTF-8编码输出数据到客户端
response.setCharacterEncoding("UTF-8");
//设置客户端浏览器以UTF-8编码解析数据
response.setContentType("text/html;charset=UTF-8");

2.如果提交方式为get,设置request对象的编码是无效的,想不乱码,只能手工转换。

  对于以get方式传输的数据,request即使设置了以指定的编码接收数据也是无效的,默认的还是使用ISO8859-1这个字符编码来接收数据,客户端以UTF-8的编码传输数据到服务器端,而服务器端的request对象使用的是ISO8859-1这个字符编码来接收数据,服务器和客户端沟通的编码不一致因此才会产生中文乱码的。解决办法:在接收到数据后,先获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题。

1
2
3
1). String data = request.getParameter("paramName"); ;// 获取获取客户端提交上来的数据,得到乱码字符串
2). byte source [] = data.getBytes("iso8859-1");//查找ISO8859-1码表,得到客户机提交的原始数据
3). data = new String (source, "UTF-8");//通过字节数组以指定的编码构建字符串,解决乱码

  通过字节数组以指定的编码构建字符串,这里指定的编码是根据客户端那边提交数据时使用的字符编码来定的,如果是GB2312,那么就设置成data = new String(source, “GB2312”),如果是UTF-8,那么就设置成data = new String(source, “UTF-8”)

注意

  URL地址后面如果跟了中文数据,一定要经过URL编码。表单提交的参数有中文数据,浏览器会自动帮我们编码,但如果是通过链接直接带中文参数,浏览器是不会帮我们编码的,这时想通过上述第二种方式解决中文乱码问题就时灵时不灵了,应该通过URLEncoding.encode(,”UTF-8”)先编码。

3.以超链接形式传递中文参数的乱码问题

  客户端想传输数据到服务器,可以通过表单提交的形式,也可以通过超链接后面加参数的形式,例如:

1
1 <a href="${pageContext.request.contextPath}/servlet/RequestDemo05?userName=gacl&name=中国">点击</a>

  点击超链接,数据是以get的方式传输到服务器的,所以接收中文数据时也会产生中文乱码问题,而解决中文乱码问题的方式与上述的以get方式提交表单中文数据乱码处理问题的方式一致,如下所示:

1
2
1 String name = request.getParameter("name");
2 name = new String(name.getBytes("ISO8859-1"), "UTF-8");

另外,需要提的一点就是URL地址后面如果跟了中文数据,那么中文参数最好使用URL编码进行处理,如下所示:

1
1 <a href="${pageContext.request.contextPath}/servlet/RequestDemo05?userName=gacl&name=<%=URLEncoder.encode("徐达沛", "UTF-8")%>">点击</a>

4. cookie中存取中文

1
2
3
4
5
6
要想在cookie中存储中文,那么必须使用URLEncoder类里面的encode(String s, String enc)方法进行中文转码,例如:

1 Cookie cookie = new Cookie("userName", URLEncoder.encode("中国", "UTF-8"));
2 response.addCookie(cookie);
  在获取cookie中的中文数据时,再使用URLDecoder类里面的decode(String s, String enc)进行解码,例如:
1 URLDecoder.decode(cookies[i].getValue(), "UTF-8");

建议:

最好一开始就统一好一种编码格式

Contents
  1. 1. 提交数据中文乱码问题总结:
    1. 1.1. 1.如果提交方式为post,想不乱码,只需要设置request对象的编码即可。
    2. 1.2. 2.如果提交方式为get,设置request对象的编码是无效的,想不乱码,只能手工转换。
    3. 1.3. 3.以超链接形式传递中文参数的乱码问题
    4. 1.4. 4. cookie中存取中文
    5. 1.5. 建议: