`
_与狼共舞
  • 浏览: 61871 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Java开发,表单提交中发生中文乱码的问题

    博客分类:
  • Java
阅读更多
  转载
       Java开发,表单提交中发生中文乱码的问题。

Web开发的中文问题一直困惑大家,尤其是对于初上手者。这次有机会彻底解决研究了一下中文乱码的原因和解决方案,做个总结。

为什么会有中文乱码?

因为在默认情况下,HTTP的包都是以“8859_1”来编码的(没办法,谁叫这些标准都是老美定的)。“8859_1”是西文编码方式,对于英文字母没 有任何问题,但是对于中文就不行了。所以,如果不做任何设定,直接将中文用“8859_1”来编码传递,那结果必然是乱码。

解决思路是什么?

好在老美还是有国际化眼光的,HTTP包的编码方式可以由用户指定。因此,只要事先指定好用相对应的编码方式来对传递内容(比如表单提交的中文等)进行编码,就可以顺利解决乱码的问题。

两个基本概念

在进入具体的解决方法之前,首先要对两个基本概念作一下解释。对于由表单提交的内容,HTTP有两种传递方式,分别是“GET”方式和“POST”方式。

“GET”方式就是将各参数直接通过HTTP的包头(head)来传递,简而言之就是直接通过我们所熟悉的网址(URL)来传递,所以我们经常能看到的在一个网址后面跟着许多复杂的由“?”和“&”构成的字符串,其实这就是需要传递的参数了。

“POST”方式则是将所需传递的参数包在HTTP的正文(body)中来传递。因此通过“POST”方式来进行传递,在浏览器的网址上面什么都看不见。

因此,相比较而言,“POST”隐蔽性较好;而“GET”方式使用起来比较容易,直接写URL就可以了。

综上所述,不难发现,解决中文乱码问题实际上就变为对这两种HTTP传递的编码方式进行适当的设定。当然,从解决问题的难易以及对系统架构的完美性角度着手,又分为以下三个层次:

1)入门方法,在所有的servlet和jsp中堆设定用的代码。

2)中级方法,对web伺服器进行配置。

3)高级方法,编写filter过滤器,对“POST”和“GET”独立过滤处理。

下面就具体描述各解决方法:

1)入门方法,在所有的servlet和jsp中“堆”写设定用的代码。

所谓入门方法,那就是现实十分简单,当然效果也是很好的。只是必须在每个相应的文件中写相同的设定代码,代码的重复性就比较大。

由前面所述,由于“POST”和“GET”方式的不同,因此对应着两种的设定方式也不同。

“POST”的情况下,如果服务器端脚本是一个servlet,那只要在doPost()方法里面插入一句

 

request.setCharacterEncode("GB2312");

 

需要注意的是,这句设定必须在所有从request对象做提取操作之前执行,如果类似于request.getParameter()的操作在前,那么系统将使用默认的“8859_1”编码方式,而忽略后面的设定代码。

如果服务器端是一个jsp脚本,那只要在该脚本的jsp申明部分做好设定即可:

 

<%@ page language="java" contentType="text/html; charset=gb2312" pageEncoding="gb2312"%>

 

如果是“GET”方式,也就是想通过URL来传递中文的话,稍微要麻烦些,首先因为浏览器地址栏是不支持中文的,也就是如果直接将中文放置在超级连接里面是无效的。因此需要在发送端对中文内容进行编码,比如:

 

URLEncoder.encoder("http://localhost/submit?name=张三","UTF-8");

 

“UTF-8”表示用这种编码方式对原字符串进行编码,编码好之后看到的结果是

 

http://localhost/submit?name=����

 

所以我们经常看到在浏览器里面有众多的类似与“����”这样的字符串,就是表明被UTF-8编码过了。由于UTF-8是跨各种平台的通用编码方式,因此比较常用于各种语言文字的传输载体。

相对应的,在接受方需要进行反向的解码即可,代码如下:

 

new String( request.getParameter("name").getBytes("8859_1"), "gb2312" );

 

这里可能会有一些疑问,为什么用“8859_1”来解码。事实上,我在第一次尝试的时候也曾使用“UTF-8”来尝试解码,结果出现乱码失败。究其原因, 尽管“张三”被编码成了“����”来传输,但是在传输过程中,“����”仍旧需要由“8859_1”来编码打包成HTTP,因此,在接收端,自然先需 要由“8859_1”来还原到“����”的“UTF-8”格式,然后再由“UTF-8”还原到“GB2312”。

所以这样也不难理解为什么所谓“浏览器地址栏是不支持中文”,不能直接用中文而要用“UTF-8”来通过“8859_1”来打包了,原因就是“����” 这串类似于密码般的字符串本身就是西文字符,用“8859_1”编解码没有任何问题。而中文由于是2byte一个汉字,直接用西文方式来编解码自然就会出 现问题。这也就是为什么称“UTF-8”为“跨各种平台的通用编码方式”了。

背景小资料:

由于“UTF-8”是通用编码方式,因此所有的语言格式均可以转换为“UTF-8”,在日益国际的今天,多语言的系统要求越来越多,因此强烈建议使用“UTF-8”来做为系统统一的编解码方式,从而彻底解决中文乱码的问题。

“UTF-8”为了能做到兼容所有语言的编解码,因此每一个字符均用2个byte来编码。这样就造成了存西文字符时需要多一倍的空间。这也算是为了通用而付出的代价了。

2)中级方法,对web伺服器进行配置

可想而知,相对于“堆”写大量代码,配置一下web伺服器config文件来解决中文乱码问题就显得优雅许多。但是由于各种web伺服器的情况不同,其配置方法也不尽相同。因此,其兼容性是个比较大的问题。

这里列举一下,如何通过修改Tomcat的conf配置文件来解决中文乱码的问题。

找到Tomcat的配置文件server.xml中的Connector这一行,为其添加一个如下的属性

 

URIEncoding = "GB2312"

 

这样就指定了使用“GB2312”来进行编解码。不过需要注意的是,tomcat4.x以以前的版本由于蒋“POST”和“GET”等同视之,因此这样一 句设定就可以适用于两种方法。而到了tomcat5.x以后,两种方式就分开处理了。因此在tomcat5.x的情况下,只做这个设定,那仅仅对 “POST”方式有效,“GET”方式仍然会得到乱码。

不过好在tomcat5.x考虑到了这个问题,提供了一个附加的参数:

 

useBodyEncodingForURI = "true"

 

如果做了这样的设定,那5.x就将兼容4.x而“POST”和“GET”等同视之。

3)高级方法,编写filter过滤器,对“POST”和“GET”独立过滤处理。

高级方法,顾名思义,就是可以脱离于任何平台,同时又免去冗余的队旗代码工作的解决方案——编写过滤器,Filter。

首先编写一个过滤器SetCharacterEncodingFilter

 

    

 

public class SetCharacterEncodingFilter implements Filter {

       

       protected String encoding = null;

       

       protected FilterConfig filterConfig = null;

          

       protected boolean ignore = true;

   // --------------------------------------------------------- Public Methods

   

   public void destroy() {

       this.encoding = null;

       this.filterConfig = null;

   }

  

   public void doFilter(ServletRequest request, ServletResponse response,

                        FilterChain chain)

   throws IOException, ServletException {

      // Conditionally select and set the character encoding to be used

       if (ignore || (request.getCharacterEncoding() == null)) {

           String encoding = selectEncoding(request);

           if(encoding != null){

               HttpServletRequest httpServletRequest = (HttpServletRequest) request;

               if(httpServletRequest.getMethod().toLowerCase().equals("post")){

                   //如果是POST方法

                   request.setCharacterEncoding(encoding);

               }

               else{

                   //如果是GET方法

                   //非常抱歉,我还有没有找到很好的对应get方法的代码

                   //一旦完成了这部分代码,马上添加在这里。

                   //!·#¥%……—*()——+|

               }

           }

           

       }

   // Pass control on to the next filter

       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 Methods

   

   protected String selectEncoding(ServletRequest request) {

       return (this.encoding);

   }

}

 

 

 

编写完过滤器以后,需要对其进行部署,也就是在web.xml中做个配置:

在<display-name>标签之后,添加:

 

 

  <filter>

 

       <filter-name>Set Character Encoding</filter-name>

       <filter-class>com.zavax.utility.filters.SetCharacterEncodingFilter</filter-class>

           <init-param>

               <param-name>encoding</param-name>

               <param-value>UTF8</param-value>

           </init-param>

           <init-param>

               <param-name>ignore</param-name>

               <param-value>true</param-value>

           </init-param>

       </filter>

   <filter-mapping>

       <filter-name>Set Character Encoding</filter-name>

       <url-pattern>/*</url-pattern>

   </filter-mapping>

分享到:
评论

相关推荐

    FORM表单中文乱码问题分析与解决

    在 Web 开发中,中文乱码问题是一个常见的问题,尤其是在FORM表单传递参数时。这个问题的根本原因是对中文的编码与解码方式不一致。我们可以理解为对中文的加密与解密的密钥不一致。例如,用UTF-8对中文编码而用ISO-...

    java中文乱码解决问题

    JAVA 中文乱码问题是开发过程中常见的问题之一,解决这个问题需要了解乱码产生的原因,然后对症下药。下面我们对容易产生乱码问题的场景进行分析,并提出解决方案。 1. 以 POST 方法提交的表单数据中有中文字符 在...

    java表单提交中文乱码的解决方法

    Java表单提交中文乱码问题是一个常见的开发中遇到的困扰,尤其在处理用户输入时,如果编码设置不当,中文字符可能会显示为乱码。解决这个问题需要理解字符编码的基本原理,并采取适当的策略。以下是一些主要的解决...

    java+jsp+mysql开发 web项目处理中文乱码问题

    在 Java+jsp+mysql 开发 web 项目中,中文乱码问题是一个常见的问题,影响着项目的正常运行。下面我们将从四个方面来解决中文乱码问题: 一、Jsp 输出中文的乱码问题 在 Jsp 页面中,如果不设置 charset,输出中文...

    解决jsp+servlet开发中的中文乱码问题

    在基于JSP(Java Server Pages)和Servlet技术的Java Web应用开发过程中,中文乱码问题一直是困扰开发者的一大难题。由于Java Web应用程序涉及多个组件之间的交互,包括但不限于JSP页面、Servlet、浏览器以及数据库...

    java获取乱码问题

    若编码方式不一致,则可能会导致数据在传输过程中发生乱码。 #### 二、乱码原因分析 1. **客户端与服务器端编码不一致**:客户端在发送请求时使用的编码格式与服务器端接收请求时采用的编码格式不同。 2. **Tomcat...

    tomcat过滤器,处理表单提交出现乱码

    当我们处理表单提交时,可能会遇到数据乱码的问题,尤其是在涉及非ASCII字符集(如中文、日文或韩文等)时。这通常与字符编码设置不正确有关。下面,我们将深入探讨这个问题,并提供解决方案。 首先,乱码问题通常...

    Java Web应用开发中的中文乱码问题研究.pdf

    在java Web应用开发中,软件开发人员最容易遇到的问题就是中文的乱码问题,其中最常见的有两种,JSP页面中文显示乱码和表单提交参数中文乱码。本文通过深入分析这两种中文乱码问题产生的原因,分别给出了对应的解决方案...

    Java Web开发中文乱码问题的研究与解决.pdf

    在Java Web开发中,中文乱码问题是一个常见的困扰,尤其对于使用Servlet和JSP技术的开发者来说。乱码问题的产生主要源于字符编码的不一致性,即在Web组件之间、Web组件与浏览器、以及Web组件与数据库之间的字符集...

    Java Web开发中的中文乱码问题分析及解决方案.pdf

    Java Web开发中的中文乱码问题是一个常见的困扰,尤其是在处理用户输入和数据显示时。问题的核心在于不同组件和环境之间编码方式的不一致。本文将深入探讨Java Web的编码机制,JSP运行原理,以及如何解决常见的乱码...

    java项目jsp中乱码问题解决

    其次,当从表单提交的数据中获取中文时,可能会遇到乱码问题。因为Tomcat默认以ISO8859-1处理POST方式提交的参数。为了解决这个问题,可以有两种策略。一种是在获取参数后立即进行编码转换,如`String str = new ...

    extjs 前后台交互参数出现中文乱码问题的解决方法

    在使用MyEclipse开发工具进行Web应用开发时,尤其是采用ExtJS框架结合Ajax技术进行前后端数据交互的过程中,可能会遇到一个常见的问题:即通过Ajax发送带有中文字符的数据时,后端接收到的数据出现乱码现象。...

    Java乱码问题解决

    在Java开发过程中,尤其是在处理中文字符时,经常遇到字符编码不一致导致的乱码问题。由于Java默认使用Unicode编码,而在中国大陆地区,常见的字符集为GB2312(GB18030)或GBK,在台湾地区则多使用Big5编码。这些...

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

    在进行Ajax开发的过程中,经常会遇到一个令人头疼的问题:表单提交的数据出现乱码。这个问题主要出现在客户端与服务器端编码不一致的情况下,导致数据传输过程中字符集转换错误。下面将详细介绍出现乱码的原因以及...

    struts 中文乱码问题解决

    在IT领域,特别是Web开发中,Struts框架作为Java Web应用的一个重要组成部分,其在处理中文字符时常常遇到乱码问题。这个问题不仅影响了用户体验,也增加了开发者的调试难度。本文将深入探讨Struts框架中中文乱码的...

    使用过滤器解决中文乱码问题

    在Web开发过程中,经常遇到的一个问题是中文或其它非ASCII字符的乱码问题。这种现象通常出现在浏览器接收的数据与实际编码格式不匹配时。解决此类问题的一种常见方法是使用过滤器(Filter)对请求进行预处理,以确保...

    Java Web开发常见问题.pdf

    ### Java Web开发中常见的中文乱码问题解析 在Java Web开发过程中,中文乱码问题是开发者经常遇到的一个挑战。这些问题主要源于Java默认的Unicode编码与HTML页面及表单默认的Latin-1编码之间的不兼容,以及在不同的...

    如何解决Tomcat下中文乱码问题?

    在IT行业中,尤其是在Java Web开发领域,Tomcat服务器在处理中文字符时经常遇到乱码问题。这主要涉及两个方面:JSP页面显示中文乱码和表单提交乱码。为了解决这些问题,我们需要理解字符编码的基本原理,并采取相应...

    Servlet及jsp解决中文乱码问题

    在Web开发中,中文乱码问题一直是困扰开发者的一大难题。特别是在使用Java技术栈(如Servlet与JSP)进行开发时,如果处理不当,很容易出现中文字符显示乱码的情况。本文将详细介绍如何在Servlet与JSP中彻底解决中文...

Global site tag (gtag.js) - Google Analytics