[Resolved] jsp設定了charset=utf-8, 中文仍然顯示為問號
2019年3月13日 21:53:04
今天遇到這樣的問題, 有關於Java的charset. 當jsp已設定charset及pageEncoding為utf8後, 對應介面出現了中文在介面上變為問號的情況. 記錄一下解決辦法.
背景: servlet3.1+jsp+tomcat85+eclipsePhoton
現象: jsp設定了charset以及paeEncoding為utf8後, 仍然中文變成問號, 檢視頁面資訊, page info顯示頁面text Encoding為windows-1252, 瀏覽器控制檯顯示response物件的charset=ISO-8859-1, 所以相當於jsp頁面的charset設定沒有起作用.
線索: 幾經輾轉, 發現問題在servlet上, servlet是有系統自動建立的, 每一個自動建立的servlet類都帶有這麼一行:response.getWriter().append("Served at: ").append(request.getContextPath());
其中的getWriter()方法的說明如下:Returns a PrintWriter object thatcan send character text to the client.The PrintWriter uses the characterencoding returned by getCharacterEncoding.If the response's character encoding has not beens pecified as described in getCharacterEncoding(i.e., the method just returns the default value ISO-8859-1), getWriterupdates it to ISO-8859-1.
所以線索已經很清晰, 因為在servlet中呼叫了response的getWriter方法, 而getWriter方法會在response物件沒有被設定character encoding的話, getWriter會自動將其設定為ISO-8859-1.
解決方案:去掉這一行固然是解決辦法, 但還有另外一種迎面而上的方式: 為response手動設定character encoding, 在getWriter上一行, 加上response.setCharacterEncoding("UTF-8");
或response.setContentType("text/html;charset=utf-8");
即可解決
但問題雖然解決, 這只是一個問題點, 由這個點,帶來的是一個知識面的問題, 比如:
- response setCharacterEncoding和setContentType的區別是什麼?
- 如果親自試過, 會發現吧setCharacterEncoding插在getWriter和forward之間是不起作用的, 原因是什麼?getWriter.write()涉及到的response緩衝區是什麼? 對應的out緩衝區是什麼? 執行順序如何?
- 此問題中, getwriter.write和RequestDispatcher.forward同時存在,為什麼最後只有forward方法實現了?