servlet设置编码无效

来源:互联网 发布:淘宝客服搞笑对话段子 编辑:程序博客网 时间:2024/05/18 06:27

提示:耐心读,你会对response的输出流有更好的理解

问题简述

servlet中在response发送之前已经设置了字符编码,但是接收到的数据头部仍然采用iso-8859-1编码,原因何在。

先看两段代码

A代码

response.addHeader("Cache-Control", "no-cache");response.setContentType("text/html; charset=utf-8");PrintWriter out = response.getWriter();out.write(htmlresult.toString());out.close();
B代码:

PrintWriter out = response.getWriter();response.addHeader("Cache-Control", "no-cache");response.setContentType("text/html; charset=utf-8");out.write(htmlresult.toString());out.close();

首先可以看出两段代码非常相似,只是其中的PrintWriter out = response.getWriter();位置不同,这也是编码发生问题的本质所在。

解释:

servlet在获取response的输出流的时候,首先检查头部信息charset的编码方式,然后根据这个编码来加载数据,对于第一段代码获取out之前已经设置了字符编码为utf-8,所以在out.write()中加载数据的时候就会使用utf-8编码进行加载,此时客户端显示汉字自然不会乱码(客户端编码设置为utf-8点前提下)。但是对于B代码,他在获取out之前,发现之前执行过得代码中没有显式设置编码格式,此时就会采用默认的iso-8859-1编码方式,那么此时即使客户端采用utf-8编码显式,最终还是会出现乱码,原因是为客户端传入的数据编码格式与当前显式编码格式相异。

题外话:

我们可以看到,不管是A代码还是B代码都是在doGet或者doPost方法之内,也就是说,这些代码都是按照顺序执行的,因此每一段代码的顺序很重要,但是如果这些代码处于全局区域,也就是方法之外(假设可以放在方法之外),比如out的获取就可以放在方法之外,此时不管是放在哪儿都不会出现乱码的问题,这是因为全局变量会在对象定义的时候初始化,而不在意他的位置。

1 0
原创粉丝点击