1. 程式人生 > >JSP頁面的pageEncoding和contentType的區別

JSP頁面的pageEncoding和contentType的區別


經常我們寫JSP頁面都會用到一下內容:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

我們可以看到,第一句設定了頁面的一些屬性。

其中包含了,編譯語言:java,顯示格式html

後面的charset和pageencoding都是"ISO-8859-1",那麼這兩者有什麼區別呢?

其實顧名思義,是很容易理解的;

pageEncoding就是JSP頁面本身的編碼;

contentType的charset是指伺服器傳送給客戶端時的內容編碼

JSP要經過兩次的“編碼”,

第一階段會用pageEncoding,

第二階段會用utf-8至utf-8,

第三階段就是由Tomcat出來的網頁, 用的是contentType。

第一階段是jsp編譯成.java,它會根據pageEncoding的設定讀取jsp,結果是由指定的編碼方案翻譯成統一的UTF-8 JAVA原始碼(即.java),如果pageEncoding設定錯了,或沒有設定,出來的就是中文亂碼。

第二階段是由JAVAC的JAVA原始碼至java byteCode的編譯,不論JSP編寫時候用的是什麼編碼方案,經過這個階段的結果全部是UTF-8的encoding的java原始碼。

舉個例子: 

<%@ page contentType="text/html;charset=utf-8" %> 

大都會打印出亂碼,因為輸入的“你好”是gbk的,但是伺服器是否正確抓到“你好”不得而知。 

但是如果更改為 

<%@ page contentType="text/html;charset=utf-8" pageEncoding="GBK"%> 

這樣就伺服器一定會是正確抓到“你好”了。

那麼,

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">


這一句又是什麼意思呢?

http-equiv 屬性為名稱/值對提供了名稱。並指示伺服器在傳送實際的文件之前先在要傳送給瀏覽器的 MIME 文件頭部包含名稱/值對。

當伺服器向瀏覽器傳送文件時,會先發送許多名稱/值對。雖然有些伺服器會發送許多這種名稱/值對,但是所有伺服器都至少要傳送一個:content-type:text/html。這將告訴瀏覽器準備接受一個 HTML 文件。

使用帶有 http-equiv 屬性的 <meta> 標籤時,伺服器將把名稱/值對新增到傳送給瀏覽器的內容頭部.