編碼問題

            本文中的大部分內容都來自互聯網,我所做的工作僅僅是把一些資料做了一下總結,希望對大家有一點點幫助!本文有待完善和測試,希望看過本文的各位朋友對本文存在的問題提出批評和指正,并期盼您的建議,多謝!!!
            第一,存文件必須以一種編碼存;讀文件也必須以一種編碼讀,如不特別設置,取系統默認的編碼,中文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。
          contentType="text/html;charset=UTF-8"表示當瀏覽器得到此文件時以什么方式解碼。例如:
          <%@ 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(http://www.ethereal.com/)

          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在windows\my.ini里default-character-set=utf-8

          2、mysql里數據庫和表也都設為utf8_unicode_ci

          3、數據庫連結:jdbc:mysql://localhost/mydb?useUnicode=true&characterEncoding=utf-8
          注意,關鍵就在于此:此句中間是'&'不是'&'這是因為數據庫連結時,在.jsp和.java文件中應該用&號,而XML文件中需要用&

          posted on 2007-04-23 11:16 肖麥 閱讀(184) 評論(0)  編輯  收藏 所屬分類: 編碼問題


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          English

          JavaAPI

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 金川县| 阳原县| 崇义县| 若羌县| 汽车| 黄平县| 庆元县| 丹寨县| 孟州市| 林芝县| 平湖市| 新田县| 安西县| 军事| 康乐县| 尚义县| 古交市| 美姑县| 阿坝县| 安溪县| 颍上县| 淮北市| 巴楚县| 保山市| 邵阳县| 辽阳县| 凤山市| 遂溪县| 铁岭县| 麻栗坡县| 濮阳市| 泸定县| 白朗县| 进贤县| 井研县| 呼和浩特市| 临潭县| 游戏| 嘉定区| 霞浦县| 通州市|