JSP頁面的pageEncoding和contentType的區別
阿新 • • 發佈:2019-02-14
經常我們寫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> 標籤時,伺服器將把名稱/值對新增到傳送給瀏覽器的內容頭部.