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

news/2024/7/3 14:52:28

使用 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


http://www.niftyadmin.cn/n/1734223.html

相关文章

c语言中的冒号运算符,问号和冒号(?:三元运算符)在objective-c中的含义是什么?...

这行代码是什么意思&#xff1f;label.frame (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;江户十一〔0〕和江户一〔1〕把我弄糊涂了。它是三元if-then-else运算符请注意&#xff0c;这应该是问号&#xff0c;而不是引号。哦&#xff0c;对不起&#xff0c;你说得对…

python搜索引擎 django_Django添加全文搜索功能入门篇

感觉网络上关于Django全文搜索的中文文章太少&#xff0c;并且讲的也不是很到位&#xff0c;就是简单介绍了怎么配置&#xff0c;并没有说这样配置有什么用&#xff0c;所以依然很迷茫。所以希望我这篇文章能够帮助到后来人。一、使用的工具haystack是django的开源搜索框架&…

解决AJAX传送中文会导致乱码的问题

关于在AJAX中GET回的ResponseText中文乱码的最简解决办法 用AJAX来GET回一个页面时&#xff0c;RESPONSETEXT里面的中文多半会出现乱码&#xff0c;这是因为xmlhttp在处理返回的 responseText的时候&#xff0c;是把resposeBody按UTF-8编码进解码考形成的&#xff0c;如果服务器…

SQL server的下载

本文链接&#xff1a;https://mp.csdn.net/mdeditor/102479776 这里&#xff0c; 推荐一个很好用&#xff0c;很良心的微信公众号叫做&#xff1a;软件安装管家 关注之后&#xff0c; 点击软件目录里面的软件目录&#xff0c;然后往下拉&#xff0c;就可以看到 其中的&#xf…

c语言打出爱心中间可以弄字,c语言 如下 输出一个心形,然后想在心形内部加入汉字,如何修改? #includ...

满意答案hrtyd4fr62016.05.13采纳率&#xff1a;41% 等级&#xff1a;6已帮助&#xff1a;507人##C#include #include using namespace std;int main(){double x, y,size10;char ch*;string message("fateland");int print_line 4;if(message.length() % 2 ! 0) …

python列表和字典的增删改查_python序列(列表,元组,字典)的增删改查

操作字典方法示例增加dict[key]value通过赋值的方法增加元素eg.>>> dict{name:li,age:1}>>> dict[class]first>>> dict{name: li, age: 1, class: first}dict.update(dict_i)把新的字典dict_i的键/值对更新到dict里(适用dict_i中包含与dict不同的ke…

Ajax表单提交数据出现乱码和解决办法

> >更多精彩技术文章>//要传递的参数var queryString "firstName" firstName "&lastName" lastName "&birthday" birthday; function //GET方式提交 doRequestUsingGET() { createXMLHttpRequest(); …

单片机DA转换实验c语言编程,单片机DA转换实验报告

实验九D/A实验报告㈠实验目的1.掌握单片机与D/A的接口及编程方法&#xff1b;2.通过D/A动态波形输出进一步理解D/A的工作原理&#xff1b;3.结合实验六中的A/D来检验软硬件的正确性。4.进一步了解单片机系统地址分配概念。㈡实验器材1.G6W仿真器一台2.MCS—51实验板一台3.PC机一…