JSP中文亂碼

 

1、響應中的亂碼

何爲響應中的亂碼?把頁面中的“username”改成“用戶名”你就知道了。

所謂響應中的亂碼,就是顯示頁面上的亂碼,因爲頁面數據是從服務器一端放入響應(response)中,然後發送給瀏覽器,如果響應中的數據無法被正常解析,就會出現亂碼問題。

爲 什麼英文就沒有問題呢?因爲在iso-8859-1gb2312, utf-8以及任意一種編碼格式下,英文編碼格式都是一樣的,每個字符佔8位,而中文就麻煩了,在gb2312下一個中文佔16位,兩字節,而在utf- 8下一個中文要佔24位,三字節。瀏覽器在不知道確定編碼方式的情況下,就會把這些字符從中間截斷,再顯示的時候就亂掉了。所以,想要解決亂碼問題,就是要告訴瀏覽器我們到底使用了什麼樣的編碼方式。

爲了獲得正常顯示的中文,需要注意以下幾步:

  1. 因爲服務器要先從本地讀取jsp文件,然後經過處理後寫入響應,所以我們首先要知道的就是jsp文件的編碼格式。從問題的源頭着手解決。

在咱們用的windowxp下,文件默認的編碼格式是gb2312

  1. 我們要在http的響應(response)中添加編碼信息,使用如下方式:

       <%@ page contentType="text/html; charset=gb2312"%>

                   

這段要放在jsp頁面的第一行,用來指定響應的類型和編碼格式,contentTypetext/html就是html內容,charset表示編碼爲gb2312。這樣瀏覽器就可以從響應中獲得編碼格式了。

這種<%@ %>的形式叫做jsp指令(directive),現在接觸到的是page指令,還有includetaglib指令,我們會在後面陸續講到。

  3、還需要在html中指定編碼格式。

         <head>

               <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

               <title>title</title>

           </head>

                   

meta部分用來指定當前html的編碼格式,注意這一段要放在head標籤中,並且放到head標籤的最前面,如果不是最前面ie下可能會出現問題,尤其是在title中有中文的情況下。

完成了以上三段檢驗,我們才能保證輸出的jsp頁面會正常顯示中文。

例子在lingo-sample/02-02/下,正常顯示的頁面index.jsp,還留了一個亂碼頁面index_wrong.jsp

2. POST亂碼

先把form里加上method="POST",讓form提交的時候使用POST方式。

發送請求的時候,使用的編碼是iso-8859-1,意味着只有英文是有效字符,這個限制是因爲當初指定http標準的成員都來自英語國家,所以如果使用默認的方式從請求獲取數據,中文一定會全部變成亂碼。

如果不信,你可以在剛纔的例子裏輸入中文,然後提交:

提交結果就會變成這樣:

怎麼解決呢?我們要jsp最前面加上一條java語句,設置請求的字符編碼。

<%

    request.setCharacterEncoding("gb2312");

%>

           

於是,那些亂碼都正常了:

例子在lingo-sample/02-03/下。

3. GET亂碼

直接點擊超鏈接,form的默認提交方式都是GET

POST方式下的解決方式還算簡單,因爲POST方式下提交的數據都是以二進制的方式附加在http請求的body部分發送,只需要在後臺指定編碼格式就足矣解決。

GET方式下會將參數直接附加到url後面,這部分參數無法使用request.setCharacterEncoding()處理,結果就是get形式的所有中文都變成了亂碼。

這時再也沒有簡便方法了,只能對這些中文一個一個進行轉換,使用new String(bytes, "gb2312")進行轉碼。

<%

    String username = request.getParameter("username");

    byte[] bytes = username.getBytes("iso-8859-1");

    String result = new String(bytes, "gb2312");

    out.print(result);

%>

           

如我們所見,先從request中獲得參數,接着把字符串按照iso-8859-1編碼打散成byte數組,然後用gb2312編碼組合成新字符串,最後打印出來就是正常的中文了。

寫在一起就變成了:

<%=new String(new String(request.getParameter("username").getBytes("iso-8859-1"), "gb2312")%>

           

這樣做的缺點,是從請求中取得的所有中文都需要轉碼,非常煩瑣。

所 以大家千萬不要像這樣<a href="test.jsp?username=測試">測試</a>,把中文參數寫到超鏈接中,form儘量使用 method="POST",這樣只需要設置request.setCharacterEncoding()就可以應付中文亂碼問題。

例子在lingo-sample/02-04/下。

經歷了這些只有非英語體系國家才能遇到的波折之後,我們的jsp終於可以接受請求中的參數,並正常響應了。下面將要進行更復雜的請求響應流程。

注意:如果是從servlet中轉發請求的話,除了以上亂碼解決方案外,還要在轉發的servlet中指定response.setContentType("text/html;charset=UTF-8");,否則,即使在頁面中做了所有亂碼處理,但是請求在轉發的那一刻變成了亂碼,在後續的頁面中無論如何都是亂碼。

所以要加上response.setContentType("text/html;charset=UTF-8");來解決此類亂碼。

發佈了36 篇原創文章 · 獲贊 5 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章