[Resolved] jsp設定了charset=utf-8, 中文仍然顯示爲問號

2019年3月13日 21:53:04html

今天遇到這樣的問題, 有關於Java的charset. 當jsp已設置charset及pageEncoding爲utf8後, 對應界面出現了中文在界面上變爲問號的狀況. 記錄一下解決辦法. windows

背景: 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");便可解決瀏覽器


但問題雖然解決, 這只是一個問題點, 由這個點,帶來的是一個知識面的問題, 好比:tomcat

  1. response setCharacterEncoding和setContentType的區別是什麼?
  2. 若是親自試過, 會發現吧setCharacterEncoding插在getWriter和forward之間是不起做用的, 緣由是什麼?getWriter.write()涉及到的response緩衝區是什麼? 對應的out緩衝區是什麼? 執行順序如何?
  3. 此問題中, getwriter.write和RequestDispatcher.forward同時存在,爲何最後只有forward方法實現了?
  4. 瀏覽器上textCoding顯示的windows1252和response對象中的charset=ISO-8859-1有什麼聯繫?
相關文章
相關標籤/搜索