經過Java Web 編碼問題一:jsp的編碼,咱們知道咱們只須要在文件中設置好編碼,就基本沒有問題了。可是咱們們之間使用Servlet的呢?
html
下面是一個簡單的測試Servlet,若是保存UserInfo.saveUser(phoneNum)返回真就輸出成功,不然就輸出失敗:java
public class UserRegisterServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static final Logger log = LogManager.getLogger(); /** * @see HttpServlet#HttpServlet() */ public UserRegisterServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); String phoneNum = request.getParameter("phoneNum"); log.info(phoneNum); if(UserInfo.saveUser(phoneNum)) response.getWriter().append("成功"); else response.getWriter().append("失敗"); } }
首先先看一看這一句,這是設置瀏覽器響應的編碼:算法
response.setContentType("text/html;charset=utf-8");
咱們來看一看客服端瀏覽器在個人的Servlet中有這一句和沒有這一句的其別,下面分別是在Servlet中設置了和沒有設置的客服端瀏覽器響應頭的的信息(Firefox debug):瀏覽器
那麼響應頭的Content-Type對瀏覽器的有什麼影響呢?請參見瀏覽器的解碼過程:服務器
http://www.w3.org/html/wg/drafts/html/master/syntax.html#parsing-with-a-known-character-encodingapp
從文檔中咱們知道對瀏覽器Content-Type是有較高優先級的,若是咱們服務器用的是utf-8編碼,而咱們沒有在Content-Type中設置,那麼瀏覽器就會使用特定的算法,或者默認的編碼或者header中meta中的信息以及其它方式來進行解碼,不一樣的瀏覽器有所不一樣。可是顯然這樣並不必定是正確的,好比在中國通常本地默認的是GBK的編碼方式,來解UTF-8顯然會出現亂碼。因此建議在Servlet要想瀏覽器輸出中文的時候用
jsp
response.setContentType("text/html;charset=utf-8");
來設置瀏覽器的響應編碼,固然charset能夠設置爲GBK或者GB18030。
測試