Servlet乱码问题
1.常见的编码种类
- utf-8: 兼容性最佳的编码,开发常用
- gbk: 浏览器默认使用的编码
2.Servlet输出过程
每次输出都是指向servlet缓冲区,service()方法结束以后,将缓冲区的内容作为响应实体,再加上设置的响应头,通过服务器一起返回给浏览器,浏览器接收后再进行显示。
3.两种输出方式
- 字节流
通过ServletOutputStream out = response.getOutputStream();
获取向Servlet缓冲区输出的字节流。由于是自己指定内容以何种编码形式进行传输,所以需要手动设置所使用的编码。
举个例子: 比如我现在想用 utf-8 编码输出一句话“希望你能喜欢我的博客”,我需要做的就是out.write("希望你能喜欢我的博客".getBytes("utf-8"));
,这样传输到servlet缓冲区的内容 就是 utf-8 编码的字节流了,如果getBytes()方法不带参数,默认是使用 gbk 进行字符编码。
service()方法结束以后,将缓冲区的内容作为响应实体送给浏览器,由于 已经是以字节表示 的,所以不需要再指定使用什么编码进行传输。 - 字符流
通过PrintWriter out=response.getWriter();
获取向Servlet缓冲区输出的字符流。调用print()方法,向Servlet缓冲区进行输出。
举个例子: 同样的我想输出一句话“希望你能喜欢我的博客”,我需要做的就是out.print("希望你能喜欢我的博客");
那么输出到Servlet缓冲区的就是以字符形式表示的这句话。
但是这样是不行的,因为字符不能直接在网络上传输,service()方法结束以后,还是需要转换成字节流。
这个时候问题就出现了,如果不手动指定以何种形式的编码传输给浏览器,那么Tomcat服务器会自动使用 iso8859-1 进行传输,这也就造成了为什么你设计的网页打开都是 ?? 的原因了。
这时候我们希望用 utf-8 的编码进行传输,需要自己指定response.setCharacterEncoding("utf-8");
4.浏览器显示采用的编码
通过步骤3的设置,我们浏览器接收到了服务器以utf-8编码返回的响应。由于大部分浏览器已经删除用户自定义采用何种编码浏览网页,而且也不应该由用户来考虑网页编码的选择。因此需要开发者来设定网页以何种编码进行显示。
解决的方法是响应中添加响应头 Content-Type ,这样浏览器接收到这个响应时,就会以指定的编码进行显示。设置的语句为response.setHeader("Content-Type", "text/html;charset=utf-8");
,这句话又等价于response.setContentType("text/html;charset=utf-8");
至此,J2EE开发中的编码问题就可以解决了。