`
tjbmx0987
  • 浏览: 51599 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

URL中文乱码解决(多种方法)

阅读更多
URL中文乱码解决(多种方法)(2)
使用 tomcat 时,相信大家都回遇到中文乱码的问题,具体表现为通过表单取得的中文数据为乱码。

一、初级解决方法
通过一番检索后,许多人采用了如下办法,首先对取得字符串按照 iso8859-1 进行解码转换,然后再按照 gb2312 进行编码,最后得到正确的内容。示例代码如下:
String para = new String( request.getParameter("para").getBytes("iso8859-1"), "gb2312");
具体的原因是因为美国人在写 tomcat 时默认使用 iso8859-1 进行编码造成的。
然而,在我们的 servlet 和 jsp 页面中有大量的参数需要进行传递,这样转换的话会带来大量的转换代码,非常不便。
二、入门级解决方法
后来,大家开始写一个过滤器,在取得客户端传过来的参数之前,通过过滤器首先将取得的参数编码设定为 gb2312 ,然后就可以直接使用 getParameter 取得正确的参数了。这个过滤器在 tomcat 的示例代码
jsp-examples 中有详细的使用示例,   其中过滤器在 web.xml 中的设定如下,示例中使用的是日文的编码,我们只要修改为 gb2312 即可
    <filter>
        <filter-name>Set Character Encoding</filter-name>
        <filter-class>filters.SetCharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>EUC_JP</param-value>
        </init-param>
    </filter>
过滤器的代码如下:
public class SetCharacterEncodingFilter implements Filter {
    // 编码的字符串
    protected String encoding = null;
   // 过滤器的配置
    protected FilterConfig filterConfig = null;
   // 是否忽略客户端的编码
    protected boolean ignore = true;
   // 销毁过滤器
    public void destroy() {
        this.encoding = null;
        this.filterConfig = null;
    }
   // 过滤方法
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain)
          throws IOException, ServletException {
        // 如果使用过滤器,忽略客户端的编码,那么使用通过过滤器设定编码
        if (ignore || (request.getCharacterEncoding() == null)) {
            String encoding = selectEncoding(request);
            if (encoding != null)
                request.setCharacterEncoding(encoding);
        }
        // 传送给下一个过滤器
        chain.doFilter(request, response);
    }

    // 初始化过滤器
    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
        this.encoding = filterConfig.getInitParameter("encoding");
        String value = filterConfig.getInitParameter("ignore");
        if (value == null)
            this.ignore = true;
        else if (value.equalsIgnoreCase("true"))
            this.ignore = true;
        else if (value.equalsIgnoreCase("yes"))
            this.ignore = true;
        else
            this.ignore = false;
    }
    // 返回过滤器设定的编码
    protected String selectEncoding(ServletRequest request) {
        return (this.encoding);
    }
}
然而在 tomcat5 中,即使使用过滤器,仍然可能取得乱码,原因何在呢?
三、高级解决方法
这是因为,在 tomcat4 和 tomcat5 中对参数的处理是不一样的,在 tomcat4 中 get 与 post 的编码是一样的,所以只要在过滤器中通过 request.setCharacterEncoding 设定一次就可以解决 get 与 post 的问题。然而,在 tomcat5 中,get 与 post 的处理是分开进行的
在 tomcat 5 中,为了解决编码问题,tomcat 的作者作了很多努力,具体表现为在 tomcat 的配置文件 server.xml 中对 Connector 元素增加了如下的配置参数,专门用来对编码进行直接的配置
URIEncoding   用来设定通过 URI 传递的内容使用的编码,tomcat 将使用这里指定的编码对客户端传送的内容进行编码。
什么是 URI 呢?
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
分享到:
评论
1 楼 wangruiyingdemama 2011-07-31  
tt 

相关推荐

    SSH 开源图形化 SFTP 客户端 WinSCP 5.17.9.zip

    一种解决方法就是在打开winscp时登录中的 Advanced Options–Environment中将 “UTF-8 encoding for filenames”设为on. 如果您是第一次使用 WinSCP,建议选择 Windows Explorer 界面,因为 Windows 用户比较熟悉这...

    VeryIDE Apps v2.0 GBK 投票,表单,PK,广告应用平台.rar

    更新 全新的操作界面,更友好,更方便,更强大更新 全新消息气泡,更加醒目友好更新 全新的安装核心,完美解决中文乱码问题更新 顶部部分菜单放置位置,用户状态放在了更显著的地方更新 针对非超级管理登录时,广告...

    VeryIDE Apps v2.0 UTF8 Build 20090921.rar

    更新 全新的安装核心,完美解决中文乱码问题 更新 顶部部分菜单放置位置,用户状态放在了更显著的地方 更新 针对非超级管理登录时,广告增加数据统计的快速显示 更新 表单用户数据导出针对长数字自动增加前置单...

    VeryIDE Apps v2.0 GBK Build 20090921.rar

    更新 全新的安装核心,完美解决中文乱码问题 更新 顶部部分菜单放置位置,用户状态放在了更显著的地方 更新 针对非超级管理登录时,广告增加数据统计的快速显示 更新 表单用户数据导出针对长数字自动增加前置单...

    JAVA 范例大全 光盘 资源

    常见问题 读取Properties文件出现中文乱码 182 第9章 Java异常处理与反射机制 183 实例73 运用throws、throw、try与catch 183 实例74 throws声明异常的实例 185 实例75 自定义异常类 187 实例76 使用finally...

    易语言程序免安装版下载

    OpenGL支持库中的部分英文名称常量已改为中文,并统一在所有常量名称之前加前缀“GL_”,以减少与其它库的冲突机率。 3. 互联网支持库中的“FTP目录列表”命令返回的文件时间改为FTP服务器返回的原始时间,不做...

    奥瑞文在线培训系统服务器安装包v2.2.9

    * 批量导入用户使用中文地域化(有些服务器没有正确设置地域信息,导致csv中文无法识别) * 修改 “修改试题”页面样式丢失问题 * 修复无法备份问题 * 修改创建临时文件的位置 * 安装包升级时改成修复模式 * 完善...

    ssh(structs,spring,hibernate)框架中的上传下载

     以上是Spring+Hibernate将文件二进制数据持久化到数据库的解决方案,而Struts通过将表单中file类型的组件映射为ActionForm中类型为org.apache.struts.upload. FormFile的属性来获取表单提交的文件数据。  工程...

    易语言 茶凉专用模块

    参数 状态, 整数型, 可空, 可空:按键(按下+放开) 1 #按键_ 3 #按下_ 4 #放开_ 如果状态大于等于5则为按下与放开之间的延时,可解决某些屏蔽 .参数 功能键方式, 逻辑型, 可空, 默认为普通键, 真:功能键方式模拟,如ctrl...

    C#编程经验技巧宝典

    2 &lt;br&gt;0003 设置程序代码行序号 3 &lt;br&gt;0004 开发环境全屏显示 3 &lt;br&gt;0005 设置窗口的自动隐藏功能 3 &lt;br&gt;0006 根据需要创建所需解决方案 4 &lt;br&gt;0007 如何使用“验证的目标架构”功能 4 ...

Global site tag (gtag.js) - Google Analytics