Request、Response乱码问题!
常见编码格式:
1.四种常见编码
(1)GBK 双字节编码,国标码,可以表示繁体字和简体字,而GB2312编码只能表示简体字,GBK兼容GB2312编码 ;
(2)ISO-8859-1 单字节编码,兼容ASCII码,相当于ASCII码的扩展,无法表示中文字符,系统默认编码 ;
(3)UNICODE 定长双字节编码,可以表示所有语言的字符,不兼容任何编码,很多软件内部是使用unicode编码来处理的 ;
(4)UTF 不定长编码,可以表示所有语言的字符,常用UTF-8,兼容iso8859-1编码;
Request 接收参数乱码原因:
由于现在的 request 属于接收客户端的参数,所以必然有其默认的语言编码,主要是由于在解析过程中默认使用的编码方式为 ISO-8859-1(此编码不支持中文),所以解析时一定会出现乱码。
Request 乱码解决方式:
1.通用方式
// 万能方法 解决乱码问题
String str = new String(uname.getBytes("ISO-8859-1"),"UTF-8");
(1)get请求:
(1)参数位置:在请求行里;
(2)编码格式:默认使用ISO-8859-1;
(3)乱码版本:在Tomcat8版本及以上版本绝大部分不会导致乱码;在Tomcat8以下,一般会导致乱码;
//实例 //万鲲 → GBK进行编码 → 1011 → 服务器默认通过ISO-8859-1进行解码 万鲲
(4)解决方式:采用通用方式:
// 万能方法 解决乱码问题 String str = new String(uname.getBytes("ISO-8859-1"),"UTF-8");
(2)post请求:
(1)参数位置:在请求体里;
(2)编码格式:页面编码utf-8;
(3)乱码版本:在Tomcat目前版本中绝大部分导致乱码;
//实例 // 中文乱码 万鲲 前台 使用页面编码UTF-8 后台 ISO-8859-1
(4)解决方式:
(设置服务器默认解码字符集,针对请求体,放在request对象之前)
// req.setCharacterEncoding("UTF-8"); req.setCharacterEncoding("UTF-8"); String uname = req.getParameter("uname");
(使用通用方式)
// 万能方法 解决乱码问题 // String str = new String(uname.getBytes("ISO-8859-1"),"UTF-8");
response数据响应中乱码原因:
如果我们响应的内容中含有中文,则有可能出现乱码。这是因为服务器响应的数据也会经过网络传输,服务器端有一种编码方式,在客户端也存在一种编码方式,当两端使用的编码方式不同时则出现乱码
(1) getWriter()的字符乱码:
对于 getWriter() 获取到的字符流,响应中文必定出乱码,由于服务器端在进行编码时默认会使用ISO-8859-1 格式的编码,该编码方式并不支持中文。所以要解决该种乱码只能在服务器端告知服务器使用一种能够支持中文的编码格式,比如我们通常用的“UTF-8” resp.setCharacterEncoding(“UTF8”);,此时还只完成了一半的工作,要保证数据正确显示,还需要指定客户端的解码方式resp.setHeader(“content-type”, “text/html;charset=UTF-8”);和服务器一致。
解决方式:
resp.setCharacterEncoding("UTF-8"); resp.setHeader("content-type", "text/html; charset=UTF-8"); PrintWriter out = resp.getWriter(); out.write("<h1>你好啊!!!!</h1>");
以上两端编码的指定也可以使用一句替代,同时指定服务器和客户端:
resp.setContentType("text/html;charset=utf-8");
(2)getOutputStream()字节乱码:
对于 getOutputStream() 方式获取到的字节流,响应中文时,由于本身就是传输的字节,所以此时
可能出现乱码,也可能正确显示,这就看人品了_。当服务器端给的字节恰好和客户端使用的编码方
式一致时则文本正确显示,否则出现乱码。
解决方式:
resp.setHeader("content-type", "text/html; charset=UTF-8"); ServletOutputStream out = resp.getOutputStream(); out.write("<h1>你好啊!!!</h1>".getBytes("UTF-8"));
同样也可以使用一句替代
resp.setContentType("text/html;charset=utf-8");
总结:
要想解决响应的乱码,只需要保证使用支持中文的编码格式。并且保证服务器端 和客户端使
用相同的编码方式即可。