常规解决乱码问题的方法是:

a.把所有的jsp页面的charset设置为UTF-8。
   b.添加过滤器,在filter内调用request.setCharacterEncoding("utf-8")方法将request的字符集设定为utf-8。
    <filter> 
       <filter-name>CharacterEncoding</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> 
    <filter-mapping> 
       <filter-name>CharacterEncoding</filter-name> 
       <url-pattern>*.action</url-pattern> 
    </filter-mapping>
   c.Tomcat(或jboss)的URIEncoding默认是ISO-8859-1,需要设置为UTF-8。
     tomcat目录下......\conf\server.xml文件中
      <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"/>
      加上 URIEncoding="UTF-8"
      <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8"/>
   以上方法全用上基本上可以解决一些普遍问题
  
   在实际的应用当中,主要会有以下四种使用方法:
   1、表单的get提交
   2、表单的post提交
   3、页面链接传递中文参数
   4、地址栏中参数直接输入中文提交(直接在ie或firefox中敲上中文进行访问)
   在分析解决以上的几种情况前,首先我们先了解一下,一个url请求并响应的流程
   浏览器 IE/FireFox ----------->Servlet容器------------------------>显示页面
       编码          使用容器的URIEncoding转码       根据页面的编码设置进行解码
  
   1.表单get方式提交
      浏览器根据页面的charset编码方式对页面进行编码,然后提交至服务器。首先,进入对应的字符编码过滤器(如果有的话),不过,Tomcat6.0,对于 get提交方式采用的是server.xml文件中的URIEncoding编码方式,而并不会采用过滤器中设置的编码,那么,根据我的环境设置,jsp页面都使用UTF-8的编码,Servlet容器的URIEncoding也设置为UTF-8,则servlet不用进行转码即可正确解码,获得正常的中文 字符串。那么,响应页面的中文因为页面的统一编码(UTF-8)自然也会正常显示。当然,如果我们的Tomcat的URIEncoding设置为其他,非UTF-8的编码方式时,页面的内容进入Tomcat解析时,因为Tomcat和页面的编码不统一,就需要转码。
  例如,如果我们采用Tomcat默认的 ISO-8859-1,那么当我们使用request.getParameter("param1")获取表单参数值时,其实Servlet就进行了转码,转码过程为UTF-8-->ISO-58859-1(我的页面charset都是UTF-8),java伪代码如下:
  new String(param1.getBytes("UTF-8"), "ISO-8859-1");

new String(变量值.getBytes("UTF-8"),"ISO-8859-1");
  例如表单的username属性以字符串"编辑"提交,那么进入容器后,FormBean中的这个变量会乱码,request.getParameter(username)一样的效果,s1就是request返回的结果,下面是内存快照。

不过,即使是这样,我们依然可以使用非常规的方法,取出并显示出正常的中文,即逆向转码,例如上面的乱码,我们可以通过ISO8859-1-->UTF-8转换一次,还原出正确的中文。
  综上所述,将Tomcat的URIEncoding设置为UTF-8(即和页面的编码一致即可)就能解决这类情况,get时,页面会先按页面设置的编码编码,再提交至web server,显示时会再根据显示页面的编码进行解码。

2.表单的post提交
 对于这种方式的请求,request.setCharacterEncoding(一般来自于web.xml中过滤器设置的参数)方法进行编码,设置将会产生作用,struts的表单提交方式默认为post方式,因此,如果都采用UTF-8编码方式,就不会产生中文乱码问题。

3.页面链接中传递中文参数
我虚拟一个这样的场景,请求页面中有如下代码

Html代码

<%
String username = "编辑";
%>
<a href="hello.do?username=<%=username%>">页面中链接传递中文</a>
对于这种方式,我们需要先将参数使用统一的编码方式编码,将编码后的字符放入链接,这里我对参数以UTF-8方式编码,如下

Java代码

<%
String username = java.net.URLEncoder.encode("编辑","UTF-8");
%>
那么,这样我们也不会产生中文乱码问题,因为,字符串编码的处理过程:字符串->UTF-8(提交的页面charset)->UTF-8(web server URIE)->UTF-8(显示的页面)。
4.地址栏中参数直接输入中文提交

考虑以下场景,在浏览器地址栏中直接输入"http://localhost:8080/helloapp.do?username=编辑"提交,对于这种方式,浏览器不会采用页面的charset方式,也不会按照filter设置的编码方式。URL中的中文进行编码后,提交至服务器(IE,FireFox都一样),而是采用系统的GBK(估计可能和browser的语言版本或设置相关,我的机器上是编码到GBK)转码为ISO- 8859-1之后,提交至Servlet容器,那么,如果对于前三种方式我们所做的设置,此种场景下就不正常了。因为,进入容器时中文进行了GBK至ISO- 8859-1的转码,而之前我们的Servlet容器URIEncoding设置为UTF-8,当我们使用 request.getParameter("username")时,相当于又进行了这样的流程GBK-->ISO- 8859-1-->UTF-8,按照以上我们使用的测试,那么就会是乱码了。此时,如果是使用GBK-->ISO- 8859-1-->GBK的方式转换,那么就能正常取出中文汉字。

对于这种情况,我们可以采用的解决办法就是,Tomcat的URIEncoding采用默认的ISO-8859-1字符集,那么我们可以在程序中通过ISO-8859-1-->GBK这样的转码方式得到正常的中文“编辑”,但这样的结果是,我们get请求方式的中文处理解决办法,就有问题了。
综上分析所述,对于乱码问题,前三种方式是一般用户的请求方式,第四种属于非正常途径的请求方式,对于这种方式产生的问题,可能无法很好的解决(和浏览器有关server端无法控制)。测试IE6的设置会影响应用路径的编码方式,例如地址栏中请求一个中文JSP页面,如:http://localhost:8080/helloapp/编辑.jsp,IE默认是勾选"以UTF-8发送 URL"项的,那么按照我上面总结的处理方式,这个请求可以正常显示页面,如图:

如果取消IE的这个选项,那么浏览器会以GBK编码应用路径的中文,得到的结果如图:

按照我上面的设置,如果将Tomcat的URIEncoding设置为GBK,则也可以正常显示页面。对于FireFox3.0,则是以UTF-8编码。因此,第四种场景是和客户端相关。
因此,在项目中尽量避免第4种场景的情况出现,就基本可以解决java web开发中的乱码问题了。

javaWeb开发中的中文编码问题的更多相关文章

  1. 解析php开发中的中文编码问题

    其实php开发中的中文编码并没有想像的那么复杂,虽然定位和解决问题没有定规,各种运行环境也各不尽然,但后面的原理是一样的. 了解字符集的知识是解决字符问题的基础. PHP程序设计中中文编码问题曾经困扰 ...

  2. Javaweb开发中URL路径的使用

    看到博客园孤傲苍狼的web系列文章中有关于URL路径的使用文章后,感觉自己对URL的使用清楚了很多,自己再对着动手写一遍以加深记忆. JavaWeb开发中常看到URL以"/"开头, ...

  3. 【详细】总结JavaWeb开发中SSH框架开发问题(用心总结,不容错过)

    在做JavaWeb的SSH框架开发的时候,遇到过很多的细节问题,这里大概记录下 我使用的IDE是Eclipse(老版本)三大框架:Spring4.Struts2.Hibernate5 1.web.xm ...

  4. JavaWeb开发中的分层思想(一)

    JavaWeb开发分层思想(一) 一.认识DAO.Service.Controller层 DAO(Data Access Object) 1.直接看英文意思就是"数据访问对象",也 ...

  5. javaweb开发中的常见错误

    Javaweb中的最常见错误及其解决方法 1.200:表示成功处理业务. 2.400 请求出错: 由于语法格式有误,服务器无法理解此请求.不作修改,客户程序就 无法重复此请求. 解决办法:,遇到400 ...

  6. javaWeb开发中关于eclipse等ide重新部署或重启项目等原因造成上传文件丢失问题解决方案

    在开发项目时,有时候需要用到上传功能,比如头像上传等,其文件会保存到服务器中.但是我发现在用eclipse做项目的过程中,每次重新部署项目,原来上传的文件就会丢失. 其原因是因为每次项目修改后,ecl ...

  7. JavaWeb开发中采用FreeMarker生成Excel表格

            最近做了一个需求,要求导出一个采购合同的Excel表格,这个表格样式比较多.由于是合同,这个Excel表格里面有好多格式要求,比如结尾处签字那部分就有格式要求.这里介绍种采用FreeM ...

  8. Javaweb开发中关于不同地方出现的绝对路径和相对路径

    1.转发和包含路径 a)以“/”开头:相对当前项目路径,即默认为http://localhost:8080/项目名/ b)不以“/”开头:相对当前Servlet路径. eg:在Aservlet中写“B ...

  9. JAVAWEB开发中过滤器的概述及使用

    1.什么是过滤器? 过滤器是向WEB应用程序的请求和响应添加功能的WEB服务组件 2.过滤器的作用 1)可以统一的集中处理请求和响应 2)可以实现对请求数据的过滤 3.过滤器的工作方式 4.使用场合 ...

随机推荐

  1. vNext之旅(2):net451、dotnet5.4、dnx451、dnxcore50都是什么鬼

    继上次"vNext之旅(1):从概念和基础开始"之后再次学习vNext重新遇到了弄不懂的事情,花了一些时间学习,今天来分享一下,为后人节省些时间. 起因 在用vNext造轮子--框 ...

  2. jQuery之Ajax--全局Ajax事件处理器

    1.这些方法用于注册事件处理器,用来处理页面上的任何 Ajax 请求,当某些事件触发后,这些事件处理器被调用.如果jQuery.ajaxSteup()中的 global 属性被设置为 true (这也 ...

  3. 一行python代码实现树结构

    树结构是一种抽象数据类型,在计算机科学领域有着非常广泛的应用.一颗树可以简单的表示为根, 左子树, 右子树. 而左子树和右子树又可以有自己的子树.这似乎是一种比较复杂的数据结构,那么真的能像我们在标题 ...

  4. 关于SQL中的排序问题

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfiguratio ...

  5. 【USACO 3.1】Score Inflation(完全背包)

    完全背包. http://train.usaco.org/usacoprob2?a=3Srffjlf4QI&S=inflate /* TASK:inflate LANG:C++ URL: */ ...

  6. please wait while windows configures microsoft visual studio professional 2013 [转载]

    2016年5月30日 VS3013安装update 2以后,打开offie出现"please wait while windows configures microsoft visual s ...

  7. WPF DataGrid绑定到数据源的方法

    string conStr = System.Configuration.ConfigurationManager.ConnectionStrings["str"].Connect ...

  8. <<< Tomcat运行提示The server does not support version 3.0

    导入了一个项目,运行Tomcat出现此错误大致由于当前导入项目服务器不支持J2ee版本 原因是导入项目的Tomcat版本是6.0,Tomcat 6.0仅支持到Servlet 2.5,而此时项目是3.0 ...

  9. Jedis测试redis

    首先:Jedis是redis的java版本的客户端. public class JedisTest { //单机版测试Jedis,不使用连接池 @Test public void testJedis( ...

  10. lua学习例子

    extern "C"{ #include <lua.h> #include <lauxlib.h> #include <lualib.h> } ...