Web亂碼解決辦法


  

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

  1. jsp頁面沒有設置編碼格式,
  2. 后台沒有在web.xml中配置字符編碼過濾器,
  3. 在ajax提交的時候用get提交,
  4. 數據庫連接的時候也可以試着加上字符編碼, 
  5. 所有的前台和后台字符編碼必須一致.

 

JSP頁面沒有設置編碼格式

JSP中“charset”與“pageEncoding”的區別

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

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

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

JSP的兩次編碼和三個階段

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

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

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

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

總結:通常我們在JSP頁面設定<%@ page contentType="text/html;charset=GB2312"%>即可。

在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文件”。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM