servlet设置编码无效

提示:耐心读,你会对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的获取就可以放在方法之外,此时不管是放在哪儿都不会出现乱码的问题,这是因为全局变量会在对象定义的时候初始化,而不在意他的位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值