spring mvc 乱码问题解决办法汇总

第一,存文件必须以一种编码存;读文件也必须以一种编码读,如不特别设置,去系统默认的编码,中文windows为GBK编码。html

从.java->.class过程是,先编写.java文件并按某种编码方式保存,而后用javac方法编译此文件,注意如.java没按系统默认编码保存则要带encoding参数指明实际编码,不然出错,生成的.class文件存为系统默认编码。java

从.jsp->.java->.class,先存为某种编码的.jsp文件,而后tomcat根据pageEncoding读取并转化为servlet存为系统默认编码,而后同上面.java->.class过程。mysql

第二,IDE的encoding为对系统下文件打开的解码方式或保存的编码方式。特例:若是.jsp文件有<%@ page language="java" pageEncoding="UTF-8"%>,则eclipse会自动存为UTF-8方式,无论eclipse的encoding是什么,这也是eclipse的聪明之处。web

第三, pageEncoding="UTF-8"表示此文件的编码方式,必须与此文件存储方式一致(因此eclipse会首选根据它来存文件),tomcat根据这个来读此.jsp文件并编译为servlet。 contentType="text/html;charset=UTF-8"表示当浏览器获得此文件时以什么方式解码。例如: <%@ page language="java" pageEncoding="UTF-8"%> <%@ page contentType="text/html;charset=iso8859-1"%>spring

<html> <head> <title>test</title> </head> <body> 我是个好人 </body> </html> 会产生乱码,由于存为UTF-8的文件被解码为iso8859-1,这样 若有中文确定出乱码。sql

至此,页面应为: <%@ page language="java" pageEncoding="UTF-8"%> <%@ page contentType="text/html;charset=UTF-8"%>数据库

<html> <head> <title>中文问题</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> </html>apache

第四, request.setCharacterEncoding("UTF-8")是把提交内容的字符集设为UTF-8 response.setCharacterEncoding("UTF-8")能够把页面中的<%@ page contentType="text/html;charset=iso8859-1"%>换为charset=UTF-8,是给告诉浏览器我这个文件的编码方式。windows

第五,表单提交:不管何种表单提交均可以在后台的java文件中经过String des = new String(s.getBytes("iso8859-1"),"UTF-8");来转换成你想要的UTF-8编码方式。但若是每处都加词句太麻烦,故分post和get两种方式区分提交(tomcat5之后分开处理,以前处理方式同样,即均可以用request.setCharacterEncoding("UTF-8")方法处理,不过tomcat5之后get提交方法用此语句无效)。 1,post提交的数据: 程序加上org.springframework.web.filter.CharacterEncodingFilter过滤器. <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter>浏览器

<filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>*.html</url-pattern> </filter-mapping> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping>

由于规范要求浏览器提交数据都要用utf8编码,因此这里设置编码方式为UTF8.

特别注意: a,这个过滤器只是简单的调用:request.setCharacterEncoding(this.encoding); 在这个语句以前不能调用任何的request.getParameter()方法,不然会设置tomcat的缺省字符集为"ISO-8859-1",而且使setCharacterEncoding的调用失效.因此在这个过滤器以前的过滤器中不能有对getParameter这类方法的调用,比较安全的作法就是把这个过滤器尽可能靠前放. b,在server.xml中不能加上<Valve className="org.apache.catalina.valves.RequestDumperValve"/> 这个value也设置tomcat的缺省字符集为"ISO-8859-1",使setCharacterEncoding的调用失效.可能其余的value也有这个问题,我没有测试过. 若是要观察http请求参数,能够考虑用过滤器或者其余工具,例如ethereal([url]http://www.ethereal.com/[/url])

2,get提交的数据: 两种状况: a,若是从地址栏直接输入汉字,则通常编码为"GBK",须要用 new String(request.getParameter("something").getBytes("ISO-8859-1"),"GBK") 取出 b,若是是页面超链接链接中带的汉字,则编码根据页面编码的不一样而不一样,若是页面的 content="text/html; charset=utf-8",则在tomcat/conf/server.xml中的配置文件中:

<!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8080 -->

<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" useBodyEncodingForURI="true" disableUploadTimeout="true" />

加上:useBodyEncodingForURI="true"便可正常使用getParameter取出正确内容. 若是content="text/html; charset=GBK",需用 new String(request.getParameter("something").getBytes("ISO-8859-1"),"GBK") 取出,其余状况相似.

总结: 1,全部页面使用utf8编码

2,服务器加上过滤器

3,server.xml中不要使用<Valve className="org.apache.catalina.valves.RequestDumperValve"/>

4,在tomcat的conf\server.xml里找到port="8080"的Connector标签,加上useBodyEncodingForURI="true"

这样应该能够搞定大多数前台的中文问题.至于地址栏输入中文,不支持也罢,通常的程序不多要求 从这里输入.

第六,链接数据库

一、mysql配置文件: 修改mysql在windows\my.ini里default-character-set=utf-8

二、mysql里数据库和表也都设为utf8_unicode_ci

三、数据库连结:jdbc:mysql://localhost/mydb?useUnicode=true&characterEncoding=utf-8 注意,关键就在于此:此句中间是'&'不是'&'这是由于数据库连结时,在.jsp和.java文件中应该用&号,而XML文件中须要用&

对于Web容器来讲,若是你不设置,默认是ISO8859-1 String des = new String(s.getBytes("iso8859-1"),"UTF-8");均可以使用这个 不论哪里,有乱码就是用

相关文章
相关标签/搜索