Web乱码解决办法

时间:2024-03-07 18:07:36

  

在项目中偶尔会遇到jsp传到后台出现中文乱码而不知所措.下面将讲解出现中文乱码的几种情况.

  1. jsp页面没有设置编码格式,
  2. 后台没有在web.xml中配置字符编码过滤器,
  3. 在ajax提交的时候用get提交,
  4. 数据库连接的时候也可以试着加上字符编码, 
  5. 所有的前台和后台字符编码必须一致.

 

JSP页面没有设置编码格式

JSP中“charset”与“pageEncoding”的区别

pageEncoding:表示页面编码,是设置JSP页面源代码的字符编码格式,如果该项的值是utf-8,则JSP源代码里不能写汉字了,如果你用的是eclipse等工具的话,保存时他会提示有一个错误,改成gbk就没事了。

charset:表示字符编码,是请求服务器以后返回过来的内容的字符编码,即使pageEncoding设置了gbk,保存,运行程序,查看页面时会发现刚才写的汉字不能正常显示,把charset改成gbk,就好了

注意:在设置JSP页面源代码字符编码的时候,如果有pageEncoding这一项,则采取这一项的值,如果没有,采取charset的值,如果都没有,采取iso8859-1。pageEncoding 和charset的预设都是 ISO8859-1. 而随便设定了其中一个, 另一个就跟着一样了(TOMCAT4.1.27是如此). 但这不是绝对的, 这要看各自JSP容器的处理方式。如:在Tomcat中如果在jsp中设定了pageEncoding,则contentType也跟着设定成相同的编码了,但是在resion中就不是,resin中还会用默认的,这点通过查看编译后的类servlet java文件就可以看到这一点,而问题恰恰就出在这里,所以,在jsp中,如果是在resin下最好还是明确的单独设定这2个属性。

JSP的两次编码和三个阶段

JSP要经过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8至utf-8,第三阶段就是由Tomcat返回来的网页,用的是charset。 

第一阶段:将jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中文乱码,或者无法编译。

第二阶段:由JAVAC的JAVA源码至java byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。 

第三阶段:Tomcat(或其的application container)载入和执行阶段,输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数charset就发挥了功效。

总结:通常我们在JSP页面设定<%@ page contentType="text/html;charset=GB2312"%>即可。

在web.xml中配置字符编码过滤器

在web.xml中配置编码过滤器时应注意的过滤器的顺序,一般将代码放在web.xml中开头的位置,因为拦截有顺序,如果放在后面的话容易拦截不到。

采用Struts2中的编码过滤器配置:

<!-- zh-cn encoding -->
<filter>
    <filter-name>struts-cleanup</filter-name>
    <filter-class>
        org.apache.struts2.dispatcher.ActionContextCleanUp
    </filter-class>
</filter>


<filter-mapping>
    <filter-name>struts-cleanup</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

采用Spring中的编码过滤器配置:

<!--中文乱码解决方案-->
<filter>
    <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

 

数据库连接时设置字符编码

例如:

url="jdbc:mysql://localhost:3306/Laptop?useUnicode=true&characterEncoding=utf-8"

 

在Tomcat中配置之请求字符串编码

默认情况下,如果tomcat中部署的webservice或者web网站需要有中文的请求参数,而这时候我们直接在浏览器中输入中文那么接受到的将是乱码,无法达到我们的需求,这时候我们就需要对Tomcat的请求链接的编码格式进行设置了。

 

     在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"/>

 

注意:有人说URIEncoding="UTF-8"必须加在最后面,否则无效,我测试时没有发现该问题,但为以防万一还是它加在后面吧;另外修改完Server.xml文件后必须重启服务。这种配置只对GET类型的请求有效,对POST请求无效。即POST请求的参数编码仍然是“ISO8859-1”,而不是“UTF-8”

 

当出现如下场景时可使用该方法:表单填写完信息后提交,将提交信息在控制台中打印出来,如果表单的使用GET提交出现乱码,而使用POST提交后控制台打印显示正常,则可以尝试使用“修改Tomcat中conf路径下的Server.xml文件”。