javaweb乱码

来源:互联网 发布:php 品质管理系统 编辑:程序博客网 时间:2024/05/01 22:42

http://bbs.itcast.cn/article-320-1.html

http://blog.csdn.net/ld513508088/article/details/8038166


概述

乱码似乎是开发人员中一个绕不开的话题,很多人甚至被乱码折磨到痛不欲生,而提起乱码而色变的也大有人在。
其实,任何问题都是有理可循的,只要弄明白原理,由原理入手设计解决方案,很多问题也就迎刃而解了。在程序设计中,我们不仅要明白怎么做,更要知道为什么这么做,这才是提升能力的必经之路。
下面,我们来分析一下Javaweb开发中常见的乱码产生的原因及其解决方案。

响应乱码的原理
服务器发送数据到浏览器,有字符和字节两种方式,这两种方式产生乱码的原理各不相同。
字节方式输出数据:
response.getOutputStream( ).write("中国".getBytes("utf-8"));
发现结果为:

结果显示产生了乱码,那么这个问题是如何产生的呢?

乱码问题,大部分都是由于编码和解码码表不同产生的,服务器在发送中文数据时,使用的是UTF-8码表,那么浏览器是用什么码表解析的呢?IE浏览器在没有特别指定码表时,将使用所在操作系统的默认码表,utf-8的数据发送给浏览器后,浏览器用gb2312打开自然就出现了乱码问题。


那么如何解决这种乱码呢?在HTTP协议中提供了Content-Type响应头,我们可以通过这个头通知浏览器发送的数据是什么格式,如果是文本数据还可以通过charset属性通知浏览器用什么编码打开,因此我们只要做如下设置即可解决乱码:


也可以通过response.setContentType(“text/
html;charset=utf-8”);快速设置。

字符方式输出数据:
ISO-8859-1肯定是不支持中文的。所以肯定要首先要做的第一件事:是要将服务器对象输出字符能支持中文的。其次服务器向客户端写回的响应头要告诉客户端是用了哪种编码表进行编码的。
如果是通过Response.getWriter().write(“中国”)输出数据给浏览器,则服务器会在发送数据时将字符转换为字节后发送,那么服务器使用的是什么编码集呢?以tomcat6为例,其默认编码集是iso8859-1,我们知道iso8859-1中是没有中文字符的,对于没有的字符iso8859-1将会使用“?”来替代,所以浏览器页面上就显示成了“?”。

此时想解决这个问题只要让服务器设置为发送数据时使用正确的码表就可以了,两码相同即可消除乱码:



get方式传递的参数内容默认编码方式问ISO8859-1
请求乱码的原理
浏览器发送请求时使用的是什么编码呢?浏览器打开表单页面时使用的什么编码就会用什么编码发送数据,我们可以通过设置打开表单页面的编码来控制页面发送数据时的编码。假设表单页面是utf-8,则这个页面发送请求参数用的也是utf-8。

而服务器是用什么编码解析的呢?以tomcat6为例,服务器默认用iso8859-1来解码,用utf-8编码,这就产生了乱码,因utf-8中是3个字节一个汉字,iso8859-1中是个字节一个字符,如“北京”为两个汉字,在utf-8中共六个字节,而iso8859-1按一个字节一个字符处理,显示出了6个问号。

我们该如何解决这个问题呢?其实,只要对POST提交做如下设置即可:

但是,这个方法只对请求的实体内容起作用,因GET提交的请求参数在地址栏后,并不在实体内容中,所以这个方法对于GET提交无效。
那么,该如何处理GET提交的乱码呢?
服务器用iso8859-1来解析,造成了乱码,由于iso8859-1无法正确显示这些字符,所以显示为了“?”,但是底层的编码仍然是正确的。所以,我们可以通过如下方式解决:
byte bs = addr.getBytes(“iso8859-1”);//将乱码解析回二进制数据
addr = new String(bs,”utf-8”);//按照正确的utf-8解码得到正确的字符






0 0
原创粉丝点击