Servlet乱码问题

1.常见的编码种类

  1. utf-8: 兼容性最佳的编码,开发常用
  2. gbk: 浏览器默认使用的编码

2.Servlet输出过程

每次输出都是指向servlet缓冲区,service()方法结束以后,将缓冲区的内容作为响应实体,再加上设置的响应头,通过服务器一起返回给浏览器,浏览器接收后再进行显示。

3.两种输出方式

  1. 字节流
    通过 ServletOutputStream out = response.getOutputStream(); 获取向Servlet缓冲区输出的字节流。由于是自己指定内容以何种编码形式进行传输,所以需要手动设置所使用的编码。
    举个例子: 比如我现在想用 utf-8 编码输出一句话“希望你能喜欢我的博客”,我需要做的就是out.write("希望你能喜欢我的博客".getBytes("utf-8"));,这样传输到servlet缓冲区的内容 就是 utf-8 编码的字节流了,如果getBytes()方法不带参数,默认是使用 gbk 进行字符编码。
    service()方法结束以后,将缓冲区的内容作为响应实体送给浏览器,由于 已经是以字节表示 的,所以不需要再指定使用什么编码进行传输。
  2. 字符流
    通过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开发中的编码问题就可以解决了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值