zoukankan      html  css  js  c++  java
  • springMVC乱码问题

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

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

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

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

    第三,
    pageEncoding="UTF-8"表示此文件的编码方式,必须与此文件存储方式一致(所以eclipse会首选根据它来存文件),tomcat根据这个来读此.jsp文件并编译为servlet。

    <%@ page language="java" pageEncoding="UTF-8"%>
    <%@ page contentType="text/html;charset=iso8859-1"%>
    <html>
    <head>
    <title>test</title>
    </head>
    <body>
    我是个好人
    </body>
    </html>
    会产生乱码,因为存为UTF-8的文件被解码为iso8859-1,这样 如有中文肯定出乱码。
    
    至此,页面应为:
    <%@ 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>

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

    第五,表单提交:无论何种表单提交都可以在后台的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,server.xml文件加上useBodyEncodingForURI="true" 
    这样应该可以搞定大多数前台的中文问题.至于地址栏输入中文,不支持也罢,一般的程序很少要求 
    从这里输入.

    第六,连接数据库 
    1、mysql配置文件:
    修改mysql在windowsmy.ini里default-character-set=utf-8
    2、mysql里数据库和表也都设为utf8_unicode_ci
    3、数据库连结: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");都可以使用这个 不论哪里,有乱码就是用

  • 相关阅读:
    168. Excel Sheet Column Title
    171. Excel Sheet Column Number
    264. Ugly Number II java solutions
    152. Maximum Product Subarray java solutions
    309. Best Time to Buy and Sell Stock with Cooldown java solutions
    120. Triangle java solutions
    300. Longest Increasing Subsequence java solutions
    63. Unique Paths II java solutions
    221. Maximal Square java solutions
    279. Perfect Squares java solutions
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/4916634.html
Copyright © 2011-2022 走看看