| 第一,存文件必須以一種編碼存;讀文件也必須以一種編碼讀,如不特別設(shè)置,去系統(tǒng)默認(rèn)的編碼,中文windows為GBK編碼。 從.java->.class過(guò)程是,先編寫(xiě).java文件并按莫種編碼方式保存,然后用javac方法編譯此文件,注意如.java沒(méi)按系統(tǒng)默認(rèn)編碼保存則要帶encoding參數(shù)指明實(shí)際編碼,否則出錯(cuò),生成的.class文件存為系統(tǒng)默認(rèn)編碼。 從.jsp->.java->.class,先存為某種編碼的.jsp文件,然后tomcat根據(jù)pageEncoding讀取并轉(zhuǎn)化為servlet存為系統(tǒng)默認(rèn)編碼,然后同上面.java->.class過(guò)程。 第二,IDE的encoding為對(duì)系統(tǒng)下文件打開(kāi)的解碼方式或保存的編碼方式。特例:如果.jsp文件有<%@ page language="java" pageEncoding="UTF-8"%>,則eclipse會(huì)自動(dòng)存為UTF-8方式,不管eclipse的encoding是什么,這也是 eclipse的聰明之處。 第三, pageEncoding="UTF-8"表示此文件的編碼方式,必須與此文件存儲(chǔ)方式一致(所以eclipse會(huì)首選根據(jù)它來(lái)存文件),tomcat根據(jù)這個(gè)來(lái)讀此.jsp文件并編譯為servlet。 contentType="text/html;charset=UTF-8"表示當(dāng)瀏覽器得到此文件時(shí)以什么方式解碼。例如: <%@ page language="java" pageEncoding="UTF-8"%> <%@ page contentType="text/html;charset=iso8859-1"%> <html> <head> <title>test</title> </head> <body> 我是個(gè)好人 </body> </html> 會(huì)產(chǎn)生亂碼,因?yàn)榇鏋閁TF-8的文件被解碼為iso8859-1,這樣 如有中文肯定出亂碼。 至此,頁(yè)面應(yīng)為: <%@ page language="java" pageEncoding="UTF-8"%> <%@ page contentType="text/html;charset=UTF-8"%> <html> <head> <title>中文問(wèn)題</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> </html> 第四, request.setCharacterEncoding("UTF-8")是把提交內(nèi)容的字符集設(shè)為UTF-8 response.setCharacterEncoding("UTF-8")可以把頁(yè)面中的<%@ page contentType="text/html;charset=iso8859-1"%>換為charset=UTF-8,是給告訴瀏覽器我這個(gè) 文件的編碼方式。 第五,表單提交:無(wú)論何種表單提交都可以在后臺(tái)的java文件中通過(guò)String des = new String(s.getBytes("iso8859-1"),"UTF-8");來(lái)轉(zhuǎn)換成你想要的UTF-8編碼方式。但如果每處都加詞句太麻煩,故 分post和get兩種方式區(qū)分提交(tomcat5以后分開(kāi)處理,之前處理方式一樣,即都可以用 request.setCharacterEncoding("UTF-8")方法處理,不過(guò)tomcat5以后get提交方法用此語(yǔ)句無(wú)效)。 1,post提交的數(shù)據(jù): 程序加上org.springframework.web.filter.CharacterEncodingFilter過(guò)濾器. <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> 因?yàn)橐?guī)范要求瀏覽器提交數(shù)據(jù)都要用utf8編碼,所以這里設(shè)置編碼方式為UTF8. 特別注意: a,這個(gè)過(guò)濾器只是簡(jiǎn)單的調(diào)用:request.setCharacterEncoding(this.encoding); 在這個(gè)語(yǔ)句之前不能調(diào)用任何的request.getParameter()方法,否則會(huì)設(shè)置tomcat的缺省字符集為"ISO-8859-1",并且 使setCharacterEncoding的調(diào)用失效.所以在這個(gè)過(guò)濾器之前的過(guò)濾器中不能有對(duì)getParameter這類方法的調(diào)用,比較安全的做 法就是把這個(gè)過(guò)濾器盡量靠前放. b,在server.xml中不能加上<Valve className="org.apache.catalina.valves.RequestDumperValve"/> 這個(gè)value也設(shè)置tomcat的缺省字符集為"ISO-8859-1",使setCharacterEncoding的調(diào)用失效.可能其他的value也有這個(gè)問(wèn)題,我沒(méi)有測(cè)試過(guò). 如果要觀察http請(qǐng)求參數(shù),可以考慮用過(guò)濾器或者其他工具,例如ethereal([url]http://www.ethereal.com/[/url]) 2,get提交的數(shù)據(jù): 兩種情況: a,如果從地址欄直接輸入漢字,則一般編碼為"GBK",需要用 new String(request.getParameter("something").getBytes("ISO-8859-1"),"GBK") 取出 b,如果是頁(yè)面超連接連接中帶的漢字,則編碼根據(jù)頁(yè)面編碼的不同而不同,如果頁(yè)面的 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取出正確內(nèi)容. 如果content="text/html; charset=GBK",需用 new String(request.getParameter("something").getBytes("ISO-8859-1"),"GBK") 取出,其他情況類似. 總結(jié): 1,所有頁(yè)面使用utf8編碼, 2,服務(wù)器加上過(guò)濾器, 3,server.xml中不要使用 <Valve className="org.apache.catalina.valves.RequestDumperValve"/> 4,server.xml文件加上useBodyEncodingForURI="true" 這樣應(yīng)該可以搞定大多數(shù)前臺(tái)的中文問(wèn)題.至于地址欄輸入中文,不支持也罷,一般的程序很少要求 從這里輸入. 第六,連接數(shù)據(jù)庫(kù) 1、mysql配置文件: 修改mysql在windows\my.ini里default-character-set=utf-8 2、mysql里數(shù)據(jù)庫(kù)和表也都設(shè)為utf8_unicode_ci 3、數(shù)據(jù)庫(kù)連結(jié):jdbc:mysql://localhost/mydb?useUnicode=true&characterEncoding=utf-8 注意,關(guān)鍵就在于此:此句中間是'&'不是'&'這是因?yàn)閿?shù)據(jù)庫(kù)連結(jié)時(shí),在.jsp和.java文件中應(yīng)該用&號(hào),而XML文件中需要用& 對(duì)于Web容器來(lái)說(shuō),如果你不設(shè)置,默認(rèn)是ISO8859-1 String des = new String(s.getBytes("iso8859-1"),"UTF-8");都可以使用這個(gè) 不論哪里,有亂碼就是用 posted on 2010-01-12 17:41 |