1、在服务端将请求和响应设置成相同的UTF-8字符编码;
如:
request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8");
2、将发送过来的数据用String类型重构
如:
String str = request.getAttribute("test"); String newString = new String(str.getBytes("iso-8859-1"),"UTF-8");
3、将客服端的URL调用一次encodeURI()方法(该方法是javascript中的),适用于浏览器不是用 UTF-8编码方式发送的情况。如:
var url = “Servlet?name=”+ encodeURL("将要传递的中文字符");
服务端:
String str = request.getAttribute("test"); String newString = new String(str.getBytes("iso-8859-1"),"UTF-8");
4、将客服端的URL调用两次encodeURI()方法(该方法是javascript中的)
客服端:
var url = “Servlet?name=”+ encodeURL(encodeURL("中"));
服务端:
String str = URIDecoder.decode(request.getAttribute("temp"),"UTF-8");
解析:
第一次encodeURL(): %E4%B8%AD
第二次encodeURL(): %25E4%25B8%25AD (将第一次的%符号转换成了25)
服务端:
第一次解码:服务器收到数据是会进行一次转码,用默认转码的编码方式,如:
String str = request.getParameter("test"); ==》 %E4%B8%AD
注:此时客服端发送过来的全部是英文字符,因此任何编码方式解码都是一样的。
第二次:用java显示的指定的编码解码。如:
String str = URIDecoder.decode(request.getAttribute("temp"),"UTF-8"); ==》“中”
注意:在所有的编码中,英文是不变的。也就是说英文字符的编码是统一的,如:‘a’用UTF-8和 iso8859-1编码后是一样的。因为中文在不同的编码方式是不一样的,才出现中文乱码。基本思路是,将中文发送和接收都用一种编码方式。但是,在传输过程中将其全部转换成英文。如:
客户端:
"中"——>%E4%B8%AD——>%25E4%25B8%25AD
|
| 传输过程 %25E4%25B8%25AD
|
服务端:
"中"<—— %E4%B8%AD<—— %25E4%25B8%25AD