<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經轉移至github,大家請訪問 http://qaseven.github.io/

    Java 亂碼解決

     1、jsp頁面的編碼方式有兩個地方需要設置:

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@ page contentType="text/html;charset=utf-8"%>

      其中:pageEncoding 指的是jsp文件本身在本地保存時的編碼方式。contentType的charset是指服務器發送網頁內容給客戶端時所使用的編碼。

      從第一次訪問一個jsp頁面開始,到這個頁面被發送到客戶端,這個Jsp頁面要經過三次編碼轉換:

      第一階段是jsp編譯成.java,它會根據pageEncoding的設定讀取jsp,結果是由指定的編碼方案翻譯成統一的UTF-8 JAVA源碼(即.java),如果pageEncoding設定錯了,或沒有設定,出來的就是中文亂碼。

      第二階段是由JAVAC的JAVA源碼至java byteCode的編譯,不論JSP編寫時候用的是什么編碼方案,經過這個階段的結果全部是UTF-8的encoding的java源碼。

      JAVAC用UTF-8的encoding讀取java源碼,編譯成UTF-8 encoding的二進制碼(即.class),這是JVM對常數字串在二進制碼(java encoding)內表達的規范。

      第三階段是Tomcat(或其的application container)載入和執行階段二的來的JAVA二進制碼,輸出的結果,也就是在客戶端見到的,這時隱藏在階段一和階段二的參數contentType就發揮了功效

      所以最終的解決方法為:

      在jsp頁面設置pageEncoding或者contentType的其中一個為支持中文的編碼格式(如utf-8,gbk,gb2312)。因為設置一個的話,另一個默認會和它一樣。

      如果兩個都設置的話,必須保證兩個都是支持中文編碼(不一定要一樣)。

      最佳建議設置如下:

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@ page contentType="text/html;charset=utf-8"%>

      2、post方式傳值亂碼:

      由于post方式傳值是通過request存儲的,在另一個頁面也是通過request.getParameter(String name)來提取信息,所以這種情況下的亂碼主要是因為request存儲信息的編碼設置導致的。post提交時,如果沒有設置提交的編碼格式,則會以iso8859-1方式進行提交,接受的jsp卻以utf-8的方式接受。所以使用如下語句即可得到單個正確的中文字符串:String str = new String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8") ;

      解決方法:

      在接收頁面設置request.setCharacterEncoding("UTF-8")。最好通過過濾器實現每個頁面都設置為request.setCharacterEncoding("UTF-8")。

      3、get方式傳值亂碼:

      get方式傳值有兩種,一種是表單get傳值,另一種是url地址傳值(實質上這兩種方式都是通過url參數的方式傳值)。

      表單方式get傳值:

      表單方式get傳值的編碼過程為,首先瀏覽器根據頁面的charset編碼方式對傳值進行編碼,然后提交至服務器交給tomcat,tomcat對這些信息進行解碼時,采用的解碼方式是由server.xml文件中的URIEncoding設置決定的,也就是說,當我們使用命令request.getParameter("")獲取表單參數值時,得到的字符串,經過了charset的編碼和URIEncoding的解碼。

     由上所知,只要charset的編碼和URIEncoding的解碼一致,并且支持中文,就能保證沒有亂碼。

      設置URIEncoding的方法如下:

      方法一:

      修改$TOMCAT/conf/server.xml文件,在HTTP Connector或者AJP Connector的配置加上URIEncoding="gbk"

    <...   maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 
          enableLookups="false" redirectPort="8443" acceptCount="100" 
      connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="gbk" />

      方法二:

      使用useBodyEncodingForURI="true". 這個方法適合你的TOMCAT實例下需要跑多個不同Encoding的程序時。

    <...  maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 
           enableLookups="false" redirectPort="8443" acceptCount="100" 
          connectionTimeout="20000" disableUploadTimeout="true" useBodyEncodingForURI="true" />

         enableLookups="false" redirectPort="8443" protocol="AJP/1.3" useBodyEncodingForURI="true" />

      在Tomcat配置中,連接器(HTTP Connector)屬性中有一個URIEncoding和

      useBodyEncodingForURI屬性,這兩個屬性設置對URL后的附加參數進行URL解碼時該如何選擇 字符集編碼。URIEncoding用于制定URL后的附加參數的字符集編碼,useBodyEncodingForURI 則說明是否采用實體內容的字符集編碼設置來替代URIEncoding的設置,也就是說當 useBodyEncodingForURI屬性設置為true時ServletRequest.setCharacterEncoding方法設置的字符集編碼也影響getParameter等方法對URL地址后的參數進行URL解碼的結果。(在/%TomCat_Home%/ conf\server.xml文件中找到 <Connector>標記,然后在后面加上useBodyEncodingForURI=true)

      url方式get傳值亂碼:

      于這種方式,瀏覽器不會采用頁面的charset方式對URL中的中文進行編碼后提交至服務器(IE,FireFox都一樣),而是采用系統的GBK轉碼為ISO-8859-1之后提交至服務器tomcat,所以這個過程為:

      首先,url地址中的中文被從gbk轉換成ISO-8859-1,交給tomcat后,又被tomcat根據URLEcoding解碼,這種情況,只有把URLEcoding設置為gbk才能在request.getParameter("")時不出現亂碼。但是這樣就會影響到上面的配置,所以一個好的解決方法是,使用java.net.URLEcoder和URLDecoder對地址中的中文進行手動編碼和解碼。

      所以一個萬全的解決方法為:

      1)所有頁面的charset設置為UTF-8。

      2)Tomcat的URIEncoding默認是ISO-8859-1,而我設置為UTF-8,主要是想解決中文命名的文件以及請求以get方式提交有可能出現的亂碼問題。

      3)添加過濾器,調用request.setCharacterEncoding("utf-8")方法將request的字符集設定為utf-8,解決請求以post方式提交的亂碼問題。

      4)url地址中存在中文參數時,首先對中文參數使用URLEcoder編碼為utf-8,然后在request.getParameter("")接收到參數后再使用URLDecoder還原。例如:

      From.jsp頁面:

    <%String username = "張某某" ; 
         username = URLEncoder.encode(username,"utf-8"); 
         %> 
         <a href="to.jsp?param=<%=username %>">轉入</a>

      To.jsp頁面

     <%=URLDecoder.decode(request.getParameter("param"),"utf-8")%>

      總之 ,亂碼的解決方案如下:

      post傳值亂碼時,在接收端設置request.setCharacterEncoding("UTF-8")

      get傳值或者url亂碼時,手動設置接收的參數String str = new String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8") ;

      由上可見get,post傳值在tomcat5中是不一樣的

    posted on 2011-12-19 16:48 順其自然EVO 閱讀(1906) 評論(0)  編輯  收藏


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


    網站導航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    <2011年12月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲免费综合色在线视频| 中文字幕亚洲日韩无线码| 最近中文字幕国语免费完整| 在线成人爽a毛片免费软件| 亚洲精品美女久久777777| 久久久久亚洲Av无码专| 亚洲香蕉在线观看| 男女啪啪免费体验区| 久草视频在线免费看| 性xxxx视频播放免费| 亚洲精品国产高清不卡在线| 亚洲四虎永久在线播放| 免费福利在线观看| 国产亚洲老熟女视频| 三年片免费高清版| 国内免费高清在线观看| 亚洲一区爱区精品无码| 狼人大香伊蕉国产WWW亚洲| 久久亚洲免费视频| 亚洲国产成AV人天堂无码| 国产免费久久精品丫丫| 四虎影视免费在线| a级毛片免费高清视频| 成年男女男精品免费视频网站 | 亚洲色精品三区二区一区| 中文成人久久久久影院免费观看| 国内自产拍自a免费毛片| 日日摸日日碰夜夜爽亚洲| 在线亚洲人成电影网站色www| 毛片亚洲AV无码精品国产午夜| 又大又硬又爽免费视频| 亚洲中文精品久久久久久不卡| 国产免费看插插插视频| 亚洲av永久无码精品天堂久久| 99久久精品免费视频| 亚洲A∨无码一区二区三区| a高清免费毛片久久| 亚洲精品在线免费观看视频| 久久久久成人精品免费播放动漫| 国产亚洲AV无码AV男人的天堂| 无码少妇精品一区二区免费动态 |