前言
乱码是我们在程序开发中经常碰到且让人头疼的一件事,尤其是我们在做javaweb开发,如果我们没有清楚乱码产生的原理,碰到乱码问题了就容易摸不着头脑,无从下手。
乱码主要出现在两部分,如下:
第一,浏览器通过表单提交到后台,如果表单内容有中文,那么后台收到的数据可能会出现乱码。
第二,后端服务器需要返回给浏览器数据,如果数据中带有中文,那么浏览器上可能会显示乱码。
接下来我们逐一分析乱码产生的原因,以及如何解决乱码问题。
一、后端收到浏览器提交的中文乱码
这里又分为get请求和post请求。
get请求
get请求,请求参数中带有中文,后台接收会出现乱码,原因是tomcat默认编码是“ISO-8859-1”,所以tomcat会使用“ISO-8859-1”对中文进行编码,该编码不支持中文,所以后台接收到就乱码了。解决方式有两种。
- param = new String(param.getBytes("ISO-8859-1"),"utf-8");
- 修改tomcat编码为"utf-8",不建议使用这种方式。
post请求
post请求,出现乱码的原因同get请求,解决方式比较简单,如下:
request.setCharacterEncoding("utf-8");
设置请求参数的编码格式为“utf-8”,这样就不会有问题了。
二、后端返回中文给浏览器发生乱码
后端返回数据给浏览器,一般也有两种形式,一种是response.getOutputStream(),一种是response.getWriter()。
两者区别以及使用规则
- getOutputStream()就是得到了OutputStream,用来向客户端(浏览器)输出任何数据,如果输出的是字符,会被转换成二进制输出,如果字符中出现中文,那么会出现“java.io.CharConversionException:Not an ISO 8859-1 character:”异常
- getWriter()是对outputStream进行了包装,用来输出字符用的。
因此,调用requonse.getWriter()方法时可实现文本字符串数据输出,调用response.getOutputStream()方法可现实字节流数据的输出。所以,如果要输出图片等二进制数据时,需要使用response.getO