Web亂碼解決辦法

  

在項目中偶爾會遇到jsp傳到後臺出現中文亂碼而不知所措.下面將講解出現中文亂碼的幾種狀況.html

  1. jsp頁面沒有設置編碼格式,
  2. 後臺沒有在web.xml中配置字符編碼過濾器,
  3. 在ajax提交的時候用get提交,
  4. 數據庫鏈接的時候也能夠試着加上字符編碼, 
  5. 全部的前臺和後臺字符編碼必須一致.

 

JSP頁面沒有設置編碼格式

JSP中「charset」與「pageEncoding」的區別

pageEncoding:表示頁面編碼,是設置JSP頁面源代碼的字符編碼格式,若是該項的值是utf-8,則JSP源代碼裏不能寫漢字了,若是你用的是eclipse等工具的話,保存時他會提示有一個錯誤,改爲gbk就沒事了。java

charset:表示字符編碼,是請求服務器之後返回過來的內容的字符編碼,即便pageEncoding設置了gbk,保存,運行程序,查看頁面時會發現剛纔寫的漢字不能正常顯示,把charset改爲gbk,就行了mysql

注意:在設置JSP頁面源代碼字符編碼的時候,若是有pageEncoding這一項,則採起這一項的值,若是沒有,採起charset的值,若是都沒有,採起iso8859-1。pageEncoding 和charset的預設都是 ISO8859-1. 而隨便設定了其中一個, 另外一個就跟着同樣了(TOMCAT4.1.27是如此). 但這不是絕對的, 這要看各自JSP容器的處理方式。如:在Tomcat中若是在jsp中設定了pageEncoding,則contentType也跟着設定成相同的編碼了,可是在resion中就不是,resin中還會用默認的,這點經過查看編譯後的類servlet java文件就能夠看到這一點,而問題偏偏就出在這裏,因此,在jsp中,若是是在resin下最好仍是明確的單獨設定這2個屬性。web

JSP的兩次編碼和三個階段

JSP要通過兩次的「編碼」,第一階段會用pageEncoding,第二階段會用utf-8至utf-8,第三階段就是由Tomcat返回來的網頁,用的是charset。 ajax

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

第二階段:由JAVAC的JAVA源碼至java byteCode的編譯,不論JSP編寫時候用的是什麼編碼方案,通過這個階段的結果所有是UTF-8的encoding的java源碼。 sql

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

總結:一般咱們在JSP頁面設定<%@ page contentType="text/html;charset=GB2312"%>便可。apache

在web.xml中配置字符編碼過濾器

在web.xml中配置編碼過濾器時應注意的過濾器的順序,通常將代碼放在web.xml中開頭的位置,由於攔截有順序,若是放在後面的話容易攔截不到。瀏覽器

採用Struts2中的編碼過濾器配置:

<!-- zh-cn encoding -->
<filter>
    <filter-name>struts-cleanup</filter-name>
    <filter-class>
        org.apache.struts2.dispatcher.ActionContextCleanUp
    </filter-class>
</filter>


<filter-mapping>
    <filter-name>struts-cleanup</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

採用Spring中的編碼過濾器配置:

<!--中文亂碼解決方案-->
<filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

 

數據庫鏈接時設置字符編碼

例如:

url="jdbc:mysql://localhost:3306/Laptop?useUnicode=true&characterEncoding=utf-8"

 

在Tomcat中配置之請求字符串編碼

默認狀況下,若是tomcat中部署的webservice或者web網站須要有中文的請求參數,而這時候咱們直接在瀏覽器中輸入中文那麼接受到的將是亂碼,沒法達到咱們的需求,這時候咱們就須要對Tomcat的請求連接的編碼格式進行設置了。

 

     在Tomcat下有個conf目錄,裏面有一個Server.xml的配置文件,其中對於每一個端口都有以下的配置:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
         redirectPort="8443"/>

咱們須要在這個配置的最後加上URIEncoding="UTF-8",即最後的形式是:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8"/>

 

注意:有人說URIEncoding="UTF-8"必須加在最後面,不然無效,我測試時沒有發現該問題,但爲以防萬一仍是它加在後面吧;另外修改完Server.xml文件後必須重啓服務。這種配置只對GET類型的請求有效,對POST請求無效。即POST請求的參數編碼仍然是「ISO8859-1」,而不是「UTF-8」

 

當出現以下場景時可以使用該方法:表單填寫完信息後提交,將提交信息在控制檯中打印出來,若是表單的使用GET提交出現亂碼,而使用POST提交後控制檯打印顯示正常,則能夠嘗試使用「修改Tomcat中conf路徑下的Server.xml文件」。

相關文章
相關標籤/搜索