首先咱們來看一張由eclipse生成的jsp文件的頭:html
圖1:JSP文件編碼
java
如上圖所示jsp中的三個編碼,瀏覽器
①表明的是服務器響應客戶端請求的編碼方式。服務器會用它來設置http響應頭的content-type。就比如在Servlet中用response.setContentType("text/html;charset=utf-8")的做用。能夠在瀏覽器的Header中響應頭中的Content-Type中看到。服務器
②pageEnconding的編碼是值jsp文件自己被編碼的編碼格式。由於jsp最終會被編譯成clss的字節碼,而字節碼是Unicode編碼的,因此必須知道格式才能轉換。若是沒有設置,eclipse會按iso-8859-1的編碼方式對其編碼。若是1沒有設置,那麼就會使用2pageEncoding的編碼來設置。eclipse
③中的content也是設置瀏覽器的解碼格式的,可是它的優先級沒有Header中的Content-Type優先級高,因此只要在Header中設置了Content-Type,那麼就基本不會使用meta中的content了。jsp
下面經過一個很是簡單的例子來測試一下:測試
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>encoding</title> </head> <body> <center> <h4>您好!</h4> </center> </body> </html>
很是簡單,運行沒有亂碼。用Firefox的debug看一下請求頭以下:ui
圖2:Header1
編碼
若是您有興趣,能夠嘗試着把圖1中①的編碼contentType去掉,發現仍是沒有亂碼,查看響應頭信息,Content-Type的編碼依然是utf-8,這是由於若是沒有設置圖1中①的編碼contentType默認使用的就是圖1中②pageEncoding的編碼方式。spa
還能夠嘗試着把③中的編碼改成iso-8859-1之類的與中文不兼容的編碼,發現仍然沒有亂碼,查看請求頭信息Content-Type的編碼依然是utf-8,而且比meta中編碼的優先級高因此瀏覽器仍是使用響應頭中的utf-8的方式來解碼。
如今咱們把中①的編碼contentType編碼改成GBK,以下圖:
圖3:contentType-GBK
在Firefox debug中查看請求頭信息Content-Type的編碼,發現Content-Type的編碼是GBK這樣證實①的編碼contentType是設置響應頭中的Content_Type。可是奇怪的是並無產生亂碼,服務器明明是utf-8編碼,響應頭是GBK爲何沒有出現亂碼呢?暫時無解。
可是咱們把中①的編碼contentType編碼改成iso-8859-1不兼容中文的編碼方式,發現就出現亂碼了。
關於圖3中沒有出現亂碼的緣由,也許咱們可以從瀏覽器的解碼過程當中找到一些提示,請參考:
www.w3.org/html/wg/drafts/html/master/syntax.html#parsing-with-a-known-character-encoding