天天看點

[error handle][servlet]轉發導緻的中文亂碼

REASON

寫了一個表單頁面webBasic.jsp,資訊送出到Servlet,然後讀取資料庫資訊轉發到webBasic.jsp。

ERROR

輸出的漢字變為了亂碼。連jsp本身的内容,原先正常的也變成了亂碼。

主要代碼和效果截圖如下:

Servlet代碼:

[error handle][servlet]轉發導緻的中文亂碼

Jsp代碼:

[error handle][servlet]轉發導緻的中文亂碼

送出前界面:

[error handle][servlet]轉發導緻的中文亂碼

送出後界面:

[error handle][servlet]轉發導緻的中文亂碼

FIND

1、html,jsp,三處設定都為”UTF-8”,浏覽器編碼更改為UTF-8一樣會出現亂碼。

2、按照視訊裡的教育,在輸出前加上語句request.setCharacterEncoding(“UTF-8”);并沒有卵用。

3、按照網上的介紹,做了個過濾器,過濾/*,結果一打開所有頁面body裡的内容都沒了。隻好暫時改成/abc,過濾還沒學過,還是以後再用吧。

HANDLE

研究轉發的原理,我們最後得到的“整個頁面”應該就是最後Response的内容。也就是說Response的編碼有問題。

在CustomerServlet doGet的第一行加入response.setCharacterEncoding(“utf-8”);頁面正常。response.setContentType(“text/html;charset=UTF-8”);也可以。

進一步發現,亂碼的關鍵在于Servlet doGet中一個response.getWriter()語句,如果response.setCharacterEncoding(“utf-8”);在其之後,最後得到的頁面就會出現亂碼。

下面是這兩個語句之間的關系。

1、response.getWriter().append(“aaa”);

response.setCharacterEncoding(“utf-8”);

set語句在之後,出現亂碼

2、response.getWriter().append(“aaa”);

無set語句,出現亂碼

3、response.setCharacterEncoding(“utf-8”);

response.getWriter().append(“aaa”);

set語句在之前,無亂碼

4、兩個語句都沒有,無亂碼。

其中原因為何,尚待研究。

另外據說解決亂碼最徹底的方法還是設定一個filter,裡面是這三行語句,留下備忘。

request.setCharacterEncoding(“UTF-8”);

response.setCharacterEncoding(“utf-8”);

response.setContentType(“text/html;charset=UTF-8”);

繼續閱讀