JSP,STRUTS等的中文亂碼解決方案

JSP,STRUTS等的中文亂碼解決方案
     其實解決的方法只有一個:
 request.setCharacterEncoding(encoding);

   方法只有一種,但處理方式就多種多樣了,初學者會在JSP頁面上直接使用,而有經驗的程序員會使用過濾器。而現在所要說的方法也是過濾器。這裏以統一使用UTF-8作爲編碼作爲例子說明。具體過程就不多說了,網上有很多教程。偷懶一點的,到TOMCAT中複製就行了。在TOMCAT的目錄下的/webapps/jsp-examples/WEB-INF/classes/filters/找到SetCharacterEncodingFilter.java 這個類,放到你的程序中並配置好映射路徑。配置好後基本上你的亂碼問題就解決了。但要映射路徑中需要注意的就是不能使用 '*'

   < filter-mapping >
    
< filter-name > Set Character Encoding </ filter-name >
    
< servlet-name > * </ servlet-name >
  
</ filter-mapping >

像上面這樣配置的話(可能也是網上大多教程的做法,想當年也是害苦了我),可能你只有JSP的亂碼解決了,要解決STRUTS的亂碼需要映射 *.do 或者 servletActionName。然後在初始化參數中設置encoding的值就行了。

< init-param >
      
< param-name > encoding </ param-name >
      
< param-value > UTF-8 </ param-value >
</ init-param >

當然,最重要的是要記得根據前面所說的方法,改變你所使用的編輯器保存文件的編碼要與使用的字符編碼一致。
而在JSP內容中,還是使用如網上教程所說的那種技倆,在所有頁面的頁首加入:

<% @ page language = "java" contentType = " text / html; charset = UTF - 8 "
    pageEncoding
= "UTF - 8 " %>

至此,相信JSP,ACTION都不太可能出現亂碼了。

資源文件的亂碼解決方案
      資源文件誰都知道是國際化支持不可或缺的一部分,如果資源文件都出現亂碼了那還了得?其實資源文件的亂碼是很好解決的,其原因也是因爲使用了UTF-8做爲JSP編碼後,沒有相應地改變資源文件的文件編碼造成的,所以只要對資源文件保存的編碼進行更正後,亂碼問題也就解決了。當然,你的中文要使用 native2ascii 命令進行正確的轉換。

調用JS時,JS內容亂碼的解決方案。
     其實JS的亂碼還是跟文件的編碼有關係的,如果JS中有中文的話,那JS文件保存的編碼就必須跟調用此JS的頁面編碼相同,否則,你的所有中文都要從JSP頁面傳給JS纔會顯示正常。可以看出對於調用JS出現的亂碼是最容易解決的(也是建立在前面的辛苦之下的)。

AJAX提交數據亂碼,返回數據亂碼的解決方案
     隨着AJAX的流行,亂碼問題也開始困擾着許多剛開始使用它的程序員,幸好我之前對JSP亂碼有過一點研究,在遇到AJAX後,並沒有給我帶來多大的困擾,在此將我的一些心得共享給大家。
     萬變不離其宗,AJAX的亂碼問題自然跟編碼有關了,其實很多人跟我一樣想到了對文件編碼進行設置,並且在接數據時設置了requet的編碼,在返回的數據時設置了response的編碼一切都以爲會很順利,可是這一切都是徒勞無功的,討厭的亂碼再一次出現在你眼前。在你試了N多種方法,包括JS自身的escape,unescape方法後,你發現亂碼仍然猖狂地出現在屏幕上。
    其實在試過這N多方法後,很多人都沒發現,解決的方法其實很簡單,而且其答案就在我們之前處理的JSP亂碼之中。讓我們先看一下AJAX的經典請求代碼

 

xmlhttp.open( "post", url, async );
xmlhttp.setRequestHeader( 
"Content-Type""text/html"
 );
xmlhttp.send( params );

通過前面的說明,不知道你現在看出端倪了沒有。不知道是受了網上教程的影響還是其它方面影響,setRequestHeader並是萬年不變的,也沒人想過去改它,而問題就正好出在這個地方。回想一個JSP頁面內容的編碼設置,其中有這麼一節:
contentType="text/html; charset=UTF-8"

現在知道問題了吧,所以我們要把第二句代碼改爲:
xmlhttp.setRequestHeader( "Content-Type""text/html;charset=UTF-8" );

最後別忘了在返回數據時也設置上:
response.setContentType( "text/xml" );
response.setCharacterEncoding( 
"UTF-8" );

是不是很簡單,一點都不麻煩呢?
如果要問爲什麼的話,其實我們可以把xmlhttp看成是一個臨時頁面,它由瀏覽器動態生成,主要作用是在後臺獲得請求的數據(可以看成是一個高級的iframe)。所以對於普通頁面設置的編碼,對它也要同樣設置。而在servlet中返回數據爲什麼要設置contentType和encoding其道理也是一樣的。衆所周知,jsp的最後形態就是servlet,而jsp頁首設置的那個內容其實也就是讓生成的servlet中生成這麼兩句話:
response.setContentType( "text/html" );
response.setCharacterEncoding( 
"UTF-8" );

而pageEncoding則是跟jvm說明了這個頁面的內容要使用什麼編碼保存(這跟之後生成的CLASS有關係)。所以在servlet設置response的編碼也是理所當然的了。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章