1. 程式人生 > >jsp超引數傳遞中文亂碼400問題,以及解決中文亂碼的全面總結。

jsp超引數傳遞中文亂碼400問題,以及解決中文亂碼的全面總結。

目錄

問題出現過程:

NewFile.jsp的我的程式碼:

<%
String haha="關於";
%>
<a href="NewFile1.jsp?name=<%=haha %>">新增使用者</a>  

NewFile1.jsp:

<%=request.getParameter("name") %>

在eclipse內建瀏覽器上執行NewFile.jsp:

瞎咕咚了半天,結果發現這不是我程式碼的問題。

我將我的URL放在別的瀏覽器上試了試,發現根本不會報錯,很憂傷....虧我一直在改程式碼,結果不是我的鍋。

so,怎麼解決呢↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

總結一番我自己的理解。

在jsp中會出現兩種編碼錯誤。一種是頁面編碼錯誤,一種是資料編碼錯誤。

頁面編碼錯誤:

最典型的是jsp檔案中的 pageEncoding和charset:設定的都是該頁面的編碼!並不是傳遞資料的編碼!

(注:這裡說的傳遞資料不是任何引數,指的是用來通過request\response\超連結\forward等傳到各種頁面的資料)

 pageEncoding和charset的區別在於:

前者是告訴編譯器要根據什麼編碼方式解碼,後者是告訴瀏覽器你要用什麼編碼去顯示介面。

例如很簡單的demo.jsp,在這裡將pageEncoding,charset都設定成UTF-8:

<body>哈哈哈
</body>

請求執行demo.jsp,首先因為我們的pageEncoding=UTF-8,所以編譯器知道要用這個編碼方式去解碼(翻譯我們寫的東西),然後由於charset=utf-8,所以我們看到的介面是中文不亂碼。顯示“哈哈哈”。

資料傳遞中的編碼錯誤:

request亂碼指的是:瀏覽器向伺服器傳送的請求引數中包含中文字元,伺服器獲取到的請求引數的值是亂碼;

response亂碼指的是:伺服器向瀏覽器傳送的資料包含中文字元,瀏覽器中顯示的是亂碼;

傳遞資料,一般都是通過request\response。

   1、request帶引數傳遞(接收資料)

例如超引數:

<a href="NewFile1.jsp?name=<%=haha %>">新增使用者</a>  

例如forward動作元素:

<jsp:forward page='welcom.jsp'>  
        <jsp:param value="<%=username %>" name="cuser"/>          
</jsp:forward> 

還有最常見的表單:

<form action="LoginServlet" method="post">
使用者名稱:<input name="username"><br>
密碼:<input name="passward"><br>
<input type="submit" value="登入">
</form>

解決request引數傳遞亂碼問題,首先要分清楚這個request是以什麼方式發出的?get?post?還是其它?

如果是post發出的,在被接受檔案中加入:

request.setCharacterEncoding("utf-8");	

即可,注意!該程式碼只適合處理post方式出現的亂碼!有很多百度知道的回答、部落格都沒分這個!誤人子弟...

如果是get就比較麻煩,例如超引數傳遞就是get方式傳遞的。由於每個人使用的tomcat版本不一樣,同樣的程式碼有的人執行就不報錯,解決方式就是網上說爛的修改各種配置檔案:get方式處理亂碼的方法

2、response帶引數傳遞(傳送資料)

例如響應跳轉:

response.setHeader("refresh","3;url=welcom.jsp?user="+username);	

還有重定向:(最好不要用重定向傳參,由於其會觸發兩次request,可能你需要的值的request不是你希望的那個)

response.sendRedirect("NewFile1.jsp?name=zho文"); 

無論是哪個,都會出現:

可以看到,這個可以直接通過位址列去修改資料的,即相當於url的請求方式(get方式)。

一般response很少會出現編碼錯誤的。所以,只要解決了被接受頁面的request的get方式接受資料的編碼錯誤,就可以了。

一般response出現編碼錯誤,往往是我們的瀏覽器編碼和我們的伺服器不匹配造成的。這時候我們才需要更改我們的response的編碼去匹配瀏覽器。(大部分時候不需要這麼做)

response.setCharacterEncoding("utf-8”);