解決JSP中文亂碼問題

  1. 大家在JSP的開發過程中,經常出現中文亂碼的問題,可能一至困擾着大家,現把JSP開發中遇到的中文亂碼的問題及解決辦法寫出來供大家參考。首先了解一下Java中文問題的由來:  
  2.   
  3. Java的內核和class文件是基於unicode的,這使Java程序具有良好的跨平臺性,但也帶來了一些中文亂碼問題的麻煩。原因主要有兩方面,Java和JSP文件本身編譯時產生的亂碼問題和Java程序於其他媒介交互產生的亂碼問題。首先Java(包括JSP)源文件中很可能包含有中文,而Java和JSP源文件的保存方式是基於字節流的,如果Java和JSP編譯成class文件過程中,使用的編碼方式與源文件的編碼不一致,就會出現亂碼。基於這種亂碼,建議在Java文件中儘量不要寫中文(註釋部分不參與編譯,寫中文沒關係),如果必須寫的話,儘量手動帶參數-ecoding GBK或-ecoding gb2312或-ecoding UTF-8編譯;對於JSP,在文件頭加上<%@ page contentType="text/html;charset=GBK"%>或  
  4.   
  5. <%@ page contentType="text/html;charset=gb2312"%>基本上就能解決這類亂碼問題。  
  6.   
  7.   
  8. 下面是一些常見中文亂碼問題的解決方法(下面例子中ecoding採用的是gb2312,也可設爲ecoding GBK或ecoding UTF-8):  
  9.   
  10. 一、 JSP頁面亂碼  
  11.   
  12. 這種亂碼問題比較簡單,一般是頁面編碼不一致導致的亂碼,一般新手容易出現這樣的問題,具體分以下兩種情況:  
  13.   
  14. Ø 未指定使用字符集編碼  
  15.   
  16. 下面的顯示頁面(display.jsp)就出現亂碼:  
  17.   
  18.   
  19.   
  20. <html>  
  21.  <head>  
  22.   <title>JSP的中文處理</title>  
  23.   <meta http-equiv="Content-Type" content="text/html charset=gb2312">  
  24.  </head>  
  25.  <body>  
  26.   <%out.print("JSP的中文處理");%>  
  27.  </body>  
  28. </html>  
  29.   
  30.   
  31.   
  32.   
  33. 這種亂碼的原因是沒有在頁面裏指定使用的字符集編碼,JSP頁面中出現了中文字符,而默認的ISO-8859-1字符集中無中文字符,解決方法:只要在頁面開始地方用下面代碼指定字符集編碼即可,在JSP頁面中指定編碼方式(gb2312),和瀏覽器解碼方式設置相同,即在頁面的第一行加上:  
  34.   
  35. <%@ page contentType="text/html; charset=gb2312"%>,就可以消除亂碼了。  
  36.   
  37. 完整頁面如下:  
  38.   
  39.   
  40. <%@ page contentType="text/html; charset=gb2312"%>  
  41. <html>  
  42.  <head><  
  43.   title>JSP的中文處理</title>  
  44.   <meta http-equiv="Content-Type" content="text/html charset=gb2312">  
  45.  </head>  
  46.  <body>  
  47.   <%out.print("JSP的中文處理");%>  
  48.  </body>  
  49. </html>  
  50.   
  51.   
  52.    
  53.   
  54. Ø 編碼字符集設置不一致  
  55.   
  56. 下面的顯示頁面(display.jsp)就出現亂碼:  
  57.   
  58.   
  59.   
  60. <%@ page language="java" pageEncoding="gb2312"%>  
  61. <%@ page contentType="text/html;charset=iso8859-1"%>  
  62. <html>  
  63. <head>  
  64. <title>JSP的中文處理</title>  
  65. <meta http-equiv="Content-Type" content="text/html charset=gb2312">  
  66. </head>  
  67. <body>  
  68. <%out.print("JSP的中文處理");%>  
  69. </body>  
  70. </html>  
  71.   
  72.   
  73.    
  74.   
  75. 這個出現亂碼原因是由於頁面編碼不一致導致的亂碼,在這個例子中我們可以看到有三處設置字符集的地方,下面分別瞭解一下這三處設置具體含義:  
  76.   
  77. 第一處<%@ page language="java" pageEncoding="gb2312"%>的編碼格式爲jsp文件的存儲格式。Eclipse會根據這個編碼格式保存文件。並編譯jsp文件,包括裏面的漢字。  
  78. 第二處編碼爲解碼格式。因爲存爲gb2312的文件被解碼爲iso8859-1,這樣如有中文肯定出亂碼。也就是必須一致。而第二處所在的這一行,可以沒有。缺省也是使用iso8859-1的編碼格式。所以如果沒有這一行的話,也會出現亂碼。必須一致纔可以。  
  79.   
  80. 第三處編碼爲控制瀏覽器的解碼方式。如果前面的解碼都一致並且無誤的話,這個編碼格式用不用設置都可以。有的網頁出現亂碼,就是因爲瀏覽器不能確定使用哪種編碼格式。因爲頁面有時候會嵌入頁面,導致瀏覽器混淆了編碼格式出現了亂碼。  
  81.   
  82. 完整解決代碼如下:  
  83.   
  84.   
  85. <%@ page language="java" pageEncoding="gb2312"%>  
  86. <%@ page contentType="text/html;charset= gb2312"%>  
  87. <html>  
  88. <head>  
  89. <title>JSP的中文處理</title>  
  90. <meta http-equiv="Content-Type" content="text/html charset=gb2312">  
  91. </head>  
  92. <body>  
  93. <%out.print("JSP的中文處理");%>  
  94. </body>  
  95. </html>  
  96.   
  97.    
  98.   
  99. 二、 表單提交中文時出現亂碼  
  100.   
  101. 下面是一個提交頁面(submit.jsp),代碼如下:  
  102.   
  103.    
  104.   
  105.   
  106. <%@ page contentType="text/html; charset=gb2312"%>   
  107. <html>  
  108. <head>  
  109. <title>JSP的中文處理</title>  
  110. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">  
  111. </head>  
  112. <body><form name="form1" method="post/get" action="process.jsp">  
  113. <div align="center">  
  114. <input type="text" name="name">  
  115. <input type="submit" name="Submit" value="Submit">  
  116. </div>  
  117. </form>  
  118. </body>  
  119. </html>  
  120.   
  121.    
  122.   
  123.   
  124. 下面是處理頁面(process.jsp)代碼:   
  125.   
  126.   
  127.   
  128. <%@ page contentType="text/html; charset=gb2312"%>  
  129. <html>  
  130. <head>  
  131. <title>JSP的中文處理</title>  
  132. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">  
  133. </head>  
  134. <body>  
  135. <%=request.getParameter("name")%>  
  136. </body>  
  137. </html>  
  138.   
  139.    
  140.   
  141. 如果submit.jsp提交英文字符能正確顯示,如果提交中文時就會出現亂碼。原因:瀏覽器默認使用UTF-8編碼方式來發送請求,而UTF- 8和GB2312編碼方式表示字符時不一樣,這樣就出現了不能識別字符。  
  142.   
  143. Ø POST提交方式  
  144.   
  145. 解決辦法:  
  146.   
  147. A、 接受參數時進行編碼轉換  
  148.   
  149. String s=new String(request.getParameter("name").getBytes("ISO-8859-1"),"gb2312") ;   
  150.   
  151. 修改後的process.jsp代碼如下:   
  152.   
  153.         
  154.   
  155.   
  156. <%@ page contentType="text/html; charset=gb2312"%>  
  157. <html>  
  158. <head>  
  159. <title>JSP的中文處理</title>  
  160. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">  
  161. </head>  
  162. <body>  
  163. <%String s=new String(request.getParameter("name").getBytes("ISO-8859-1"),"gb2312") ;out.print(s);%>  
  164. </body>  
  165. </html>  
  166.   
  167.    
  168.   
  169.   
  170. 如果使用該方法的話,每一個參數都必須這樣進行轉碼。很麻煩。但確實可以拿到漢字。  
  171.   
  172. B、通過request.seCharacterEncoding ("gb2312")對請求進行統一編碼,就實現了中文的正常顯示。  
  173.   
  174. 修改後的process.jsp代碼如下:   
  175.   
  176.   
  177.   
  178. <%@ page contentType="text/html; charset=gb2312"%>  
  179. <%request.seCharacterEncoding("gb2312");%>  
  180. <html>  
  181. <head>  
  182. <title>JSP的中文處理</title>  
  183. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">  
  184. </head>  
  185. <body>  
  186. <%=request.getParameter("name")%>  
  187. </body>  
  188. </html>  
  189.   
  190.    
  191.   
  192. 如果使用該方法接受此參數的頁面就不必在轉碼了,即可得到漢字參數。但每頁都需要執行這句話。  
  193.   
  194. C、爲了避免每頁都要寫request.setCharacterEncoding("gb2312"),可以使用過濾器對所有jsp  
  195.   
  196. 進行編碼處理。就是使用Servlet規範中的過慮器指定編碼,主要代碼如下:  
  197.   
  198.   
  199.   
  200. import java.io.*;  
  201. import javax.servlet.Filter;  
  202.  import javax.servlet.FilterChain;   
  203. import javax.servlet.FilterConfig;   
  204. import javax.servlet.ServletException;   
  205. import javax.servlet.ServletRequest;   
  206. import javax.servlet.ServletResponse;   
  207. public class SetCharacterEncodingFilter implements Filter {  
  208. protected String encoding = null;   
  209. public void destroy(){   
  210. this.encoding = null;   
  211. }   
  212. public void init(FilterConfig filterConfig) throws ServletException{   
  213. this.encoding = filterConfig.getInitParameter("encoding");  
  214. }  
  215. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{  
  216. request.setCharacterEncoding(encoding);  
  217. response.setContentType("text/html;charset="+encoding);  
  218. chain.doFilter(request, response);  
  219. }  
  220. }  
  221.   
  222.    
  223.   
  224.    
  225.   
  226. 過濾器在web.xml中的配置如下:  
  227.   
  228.   
  229.   
  230. <filter>  
  231. <filter-name>SetCharacterEncodingFilter</filter-name>  
  232. <filter-class>SetCharacterEncodingFilter</filter-class>  
  233. <init-param>  
  234. <param-name>encoding</param-name>  
  235. <param-value>gb2312</param-value>  
  236. </init-param>  
  237. </filter>  
  238. <filter-mapping><filter-name>SetCharacterEncodingFilter</filter-name>  
  239. <url-pattern>/*</url-pattern>  
  240. </filter-mapping>  
  241.   
  242.    
  243.   
  244.   
  245. 修改後的process.jsp代碼如下:   
  246.   
  247.   
  248.   
  249. <%@ page contentType="text/html; charset=gb2312"%>  
  250. <html>  
  251. <head>  
  252. <title>JSP的中文處理</title>  
  253. </head>  
  254. <body>  
  255. <%=request.getParameter("name")%>  
  256. </body>  
  257. </html>  
  258.   
  259.   
  260.    
  261.   
  262. 以上方法只對POST方式提交有效果。  
  263.   
  264. Ø GET提交方式  
  265.   
  266. 如果使用get方式提交中文,接受參數的頁面也會出現亂碼,這個亂碼的原因也是tomcat的內部編碼格式iso8859-1導致。Tomcat會以get的缺省編碼方式iso8859-1對漢字進行編碼,編碼後追加到url,導致接受頁面得到的參數爲亂碼。  
  267.   
  268. 解決辦法:  
  269.   
  270. A、 使用POST提交方式解決辦法的第一種方式,對接受到的字符進行解碼,再轉碼。  
  271.   
  272. B 、首先配置tomcat下server.xml的Connector節點增加useBodyEncodingForURI="true"屬性配置,然後在JSP頁面中加入<%request.seCharacterEncoding("gb2312");%>所設置的編碼格式進行編碼。  
  273.   
  274. 1、Tomcat中server.xml配置如下:  
  275.   
  276.   
  277. <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI="true"/>  
  278.   
  279.     
  280.   
  281.   
  282. 2、修改後的process.jsp代碼如下:   
  283.   
  284.   
  285.   
  286. <%@ page contentType="text/html; charset=gb2312"%>  
  287. <%request.seCharacterEncoding("gb2312");%>  
  288. <html>  
  289. <head>  
  290. <title>JSP的中文處理</title>  
  291. <meta http-equiv="Content-Type" content="text/html; charset=gb2312"></head><body><%=request.getParameter("name")%>  
  292. </body>  
  293. </html>  
  294.   
  295.    
  296.   
  297. 三、數據庫連接出現亂碼  
  298.   
  299. 這種亂碼會使你插入數據庫的中文變成亂碼,或者讀出顯示時也是亂碼,解決方法如下:  在數據庫連接字符串中加入編碼字符集   
  300.   
  301. String Url=" jdbc:sqlserver://localhost:1433; DataBaseName=mydb;user=sa&password=sa&useUnicode=true&characterEncoding=GB2312";   
  302.   
  303.  並在JSP頁面中使用如下代碼:   
  304.   
  305.    
  306.   
  307. response.setContentType("text/html;charset=gb2312");  request.setCharacterEncoding("gb2312");  
  308.    
  309.   
  310.   
  311. 四、關於jsp在MyEclipse中打開的亂碼問題  
  312.   
  313. 對於一個已經存在的項目,Jsp文件的存儲格式可能是utf-8。如果新安裝的eclipse,則缺省打開使用的編碼格式可能iso8859-1。所以導致 jsp裏面的漢字出現亂碼。這個亂碼魚解決方式如下:  
  314.   
  315. A、Myeclispe Window - > Preferences彈出屬性窗口  
  316.   
  317. General - > Workspace 設置Text file encoding 全局設置。  
  318.   
  319. B、右鍵你的項目---屬性---Text file encoding 項目設置  
  320.   
  321. 五、關於html頁面在eclipse中打開出現亂碼情況  
  322.   
  323. 由於大部分頁面都是由dreamweaver製作,其存儲格式跟eclipse的識別有差別導致。  
  324.   
  325. 一般這種情況,在eclipse中新建一個jsp,直接從dreamweaver複製頁面內容粘貼到jsp即可。  
  326.   
  327. 六、JSP頁面通過URL傳遞中文參數的亂碼問題  
  328.   
  329. 在項目中,我們經常遇到需要在jsp頁面切換中傳遞中文字符。例如:http://website/test1.jsp?act=add&type=蘋果  
  330.   
  331. Ø 一般來說我們很少直接在URL裏面把參數寫成中文,如例子中的"type=蘋果"這樣傳遞。如果出現這種情況,在我們的接收參數的頁面我們只需要做個簡單的轉換就可以了。   
  332.   
  333. 代碼test1.jsp:(主要部分)  
  334.   
  335.      
  336.   
  337. <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>  
  338. <%String type = request.getParameter("type");  
  339. String result = new String(type.getBytes("iso-8859-1"), "gb2312");  
  340. out.println(result);%>  
  341.    
  342.   
  343. Ø 更普遍的做法,就是對url中的中文字符進行編碼,變成類似type=%20D%20B這樣的字符。  
  344.   
  345. 代碼MyJsp1.jsp:  
  346.   
  347.    
  348.   
  349.   
  350. <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>  
  351. <%@ page import="java.net.*" %>  
  352. <a href='./MyJsp2.jsp?act=<%=URLEncoder.encode("中國人 非常好")%>'>test</a>  
  353.    
  354.   
  355. 代碼MyJsp2.jsp:  
  356.   
  357. <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>  
  358. <%@ page import="java.net.*" %>  
  359. <%String tempVal = URLDecoder.decode(request.getParameter("act"));  
  360. out.println(new String(tempVal.getBytes("ISO-8859-1"), "gb2312"));  
  361. %>  
發佈了37 篇原創文章 · 獲贊 4 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章