黑马程序员技术交流社区

标题: 乱码? [打印本页]

作者: 蔡园园    时间: 2011-9-29 11:13
标题: 乱码?
在javaWeb开发过程中,我们时常为乱码所困扰。比如说我们用get方式提交数据时,解决乱码不能采用setContentType方式,因为
其提交的数据是封装在消息头,而只能采用转码方式;而我们采用post提交数据时,解决乱码可以采用setContentType方式解决,因为提交的数据时封装在正文中。所以我想问大家,在javaweb开发中在哪些情况下会产生乱码,以及解决乱码的方式,最好把产生乱码原因附上.
作者: 匿名    时间: 2011-9-29 11:50
这个问题太广泛了,乱码的原因多了去。我用纯jsp写的话,一般情况下出乱码的几率较多。使用get传中文字符时会出现乱码,比如jsp页面的编码不统一,有的jsp页面是gb2312的,有的是utf-8,有的是gbk等等。都会出现乱码问题

解决乱码的方法大致上分三种:
1,开发者自己找出症结所在,检查编码方式是否统一,在使用get方式提交表单数据时,是直接传还是使用URLEncoding方法,在接收方又是怎么接收的。是不是使用String类提供方法进行解码,还是直接接收。

2,容器的设置,拿tomcat来说说,一般可以修改tomcat目录下的conf/server.xml,具体可以谷歌百度,篇幅较大在这里不做具体的讲解了。

3,如果上面两种方式还不能解决乱码,那我们就要使用过滤器了。有了它,神马乱码一切都搞定。
作者: 匿名    时间: 2011-9-29 11:52
get请求表单的字段是通过url传过去的,因为url地址栏是不能出现中文的,所以会出现中文乱码,

一、初级解决方法
String para = new String( request.getParameter("para").getBytes("iso8859-1"), "gb2312");
二、入门级解决方法
<filter>
        <filter-name>Set Character Encoding</filter-name>
        <filter-class>filters.SetCharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>gbk</param-value>
        </init-param>
    </filter>
三、高级解决方法
java doc 的说明中如下说明:URI 是统一资源标识符,而 URL 是统一资源定位符。因此,笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。这是因为 URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源。
也就是说,我们通过 get 方法提交的参数实际上都是通过 uri 提交的,都由这个参数管理,如果没有设定这个参数,则 tomcat 将使用默认的 iso8859-1 对客户端的内容进行编码。
useBodyEncodingForURI 使用与 Body 一样的编码来处理 URI, 这个设定是为了与 tomcat4保持兼容,原来在 tomcat4 和 tomcat5 中队参数的处理是不一样的,在 tomcat4 中 get 与 post 的编码是一样的,所以只要在过滤器中通过 request.setCharacterEncoding 设定一次就可以解决 get 与 post 的问题。然而,在 tomcat5 中,get 与 post 的处理是分开进行的,对 get 的处理通过 前面的 URIEncoding 进行处理,对 post 的内容依然通过 request.setCharacterEncoding 处理,为了保持兼容,就有了这个设定。
将 useBodyEncodingForURI 设定为真后,就可以通过 request.setCharacterEncoding 直接解决 get 和 post 中的乱码问题。
这样,我们可以通过在 server.xml 中设定 URIEncoding 来解决 get 方法中的参数问题,使用过滤器来解决 post 方法中的问题。
或者也可以通过在 server.xml 中设定 useBodyEncodingForURI 为 true ,配合过滤器来解决编码的问题。
在这里,我强烈建议在网站的创作过程中,全程使用 utf-8 编码来彻底解决乱码问题。
具体操作如下:
1、页面内容使用 utf-8 格式保存,在页面中加入 <mete http-equiv="contentType" content="textml;charst=utf-8">
2、服务器端的 server.xml 中设定 useBodyEncodingForURI = true
3、使用过滤器,过滤器设定编码为 utf-8
作者: 匿名    时间: 2011-9-29 12:03
曾经用到过的一个编码过滤器

配置在 Spring  中的..  分享一下


<!-- Spring  编码过滤器-->
        <filter>
                <filter-name>encodingFilter</filter-name>
                <filter-class>
                        org.springframework.web.filter.CharacterEncodingFilter
                </filter-class>
                <init-param>
                        <param-name>encoding</param-name>
                        <param-value>UTF-8</param-value>
                </init-param>
                <init-param>
                        <param-name>forceEncoding</param-name>
                        <param-value>true</param-value>
                </init-param>
        </filter>
作者: 匿名    时间: 2011-9-29 14:29
之所以会产生乱码是因为你使用编码和和默认的编码不一致,例如现在本机的默认编码是GBK,但你在程序中却使用ISO8859-1编码,这就会造成乱码。所以如果要避免乱码,则程序的编码应与默认的编码保持一致。例如你的本机默认编码是GBK,那么你可以设置编码如下:
<filter>
        <filter-name>Set Character Encoding</filter-name>
        <filter-class>filters.SetCharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>GBK</param-value>
        </init-param>
    </filter>




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2