Java Web 編碼問題一:jsp的編碼問題

首先咱們來看一張由eclipse生成的jsp文件的頭:html

圖1:JSP文件編碼
java

如上圖所示jsp中的三個編碼,瀏覽器

  1. ①表明的是服務器響應客戶端請求的編碼方式。服務器會用它來設置http響應頭的content-type。就比如在Servlet中用response.setContentType("text/html;charset=utf-8")的做用。能夠在瀏覽器的Header中響應頭中的Content-Type中看到。服務器

  2.  ②pageEnconding的編碼是值jsp文件自己被編碼的編碼格式。由於jsp最終會被編譯成clss的字節碼,而字節碼是Unicode編碼的,因此必須知道格式才能轉換。若是沒有設置,eclipse會按iso-8859-1的編碼方式對其編碼。若是1沒有設置,那麼就會使用2pageEncoding的編碼來設置。eclipse

  3. ③中的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

相關文章
相關標籤/搜索