第一,存文件必須以一種編碼存;讀文件也必須以一種編碼讀,如不特別設置,去系統默認的編碼,中文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");均可以使用這個 不論哪裏,有亂碼就是用