Character Encoding in Java Web (TOMCAT)

[TOC]html

原文:Character Encoding Issuesjava

請求體和響應體的默認字符編碼

若是沒有指定具體的字符編碼,servlet會使用ISO-8859-1來對請求進行編碼。(響應和請求的)HTTP消息體的字符編碼在Content-Type頭字段中指定,好比: Content-Type: text/html; charset=ISO-8859-1web

When no explicit charset parameter is provided by the sender, media subtypes of the "text" type are defined to have a default charset value of "ISO-8859-1" when received via HTTP. Data in character sets other than "ISO-8859-1" or its subsets MUST be labeled with an appropriate charset value.apache

對使用標準語法的jsp頁面來講,默認的響應字符集一般是ISO-8859-1,可是在XML語法中是UTF-8瀏覽器

###URI編碼規範 URI語法規範規定任何US-ASCII字符以外的字符必須使用%轉義序列進行編碼:每一個字符編碼成一個%和兩個表示該字符碼的十六進制碼,好比:US-ASCII character code 97 = 0x61,URI沒有具體的默認編碼。tomcat

####關於URI字符編碼:app

  1. ISO-8859-1ASCII對字符碼0x20 ~ 0x7E是相互兼容的,大部分網站使用ISO-8859-1做爲默認的查詢字符串(query string);
  2. 許多瀏覽器開始提供使用UTF-8編碼URL的選項,而再也不是使用ISO-8859-1來編碼URI。一些瀏覽器彷佛使用當前頁面的編碼來對頁面中連接的URI進行編碼;
  3. HTML 4.0 推薦使用UTF-8來編碼查詢字符串(query string);
  4. 不肯定時,將可能出現編碼異常的查詢字符串(query string)用POST請求發送。

####關於POST請求編碼:webapp

  1. HTTP/1.1代表HTTP消息的接收方必須按照發送方在Content-Type頭中指定的編碼方式進行編碼(前提是接收方支持該編碼)。
  2. 目前大部分瀏覽器不會指定請求的字符集,即便是ISO-8859-1之外的編碼。看起來違反了HTTP規範,可是大部分瀏覽器彷佛發送請求時使用當前頁面使用的編碼來生成POST請求。

###修改GET請求參數的編碼jsp

  • Tomcat 使用ISO-8859-1做爲整個URL,包括查詢字符串(query string),的默認字符編碼。
  • 有兩種方法來指定如何解釋GET請求的參數:
    1. 編輯server.xml文件下的<Connector>元素,設置URIEncoding屬性爲具體值,好比:URIEncoding="UTF-8"
    2. 編輯server.xml文件下的<Connector>元素,設置useBodyEncodingForURI 屬性的值爲true,這將致使Connector對GET請求的參數使用請求體的編碼。

###修改POST請求參數的編碼 經過使用javax.servlet.Filter設置請求編碼 5.xide

webapps/servlets-examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.java
webapps/jsp-examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.java

6.x

webapps/examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.java

5.5.36+, 6.0.36+, 7.x 從7.0.20開始,過濾器開始變成一等公民而且從examples移到了core,任何web應用再也不須要單獨編譯和綁定便可使用。此方法能夠移植到較舊的版本5.5.36和6.0.36。

org.apache.catalina.filters.SetCharacterEncodingFilter

請求編碼設置必須在參數被解析以前完成纔有效,一旦解析開始,就沒法逆轉。當第一個獲取參數名或參數值的函數被調用參數解析即被觸發,確保將這個過濾器配置在全部獲取參數名或值的過濾器以前。

Tomcat提供的過濾器

###在全部地方使用UTF-8 爲了徹底轉換到UTF-8編碼,須要確保如下的改動:

  1. 設置server.mxl中<Connector>元素的URIEncoding="UTF-8";

  2. 使用字符編碼過濾器設置默認編碼爲UTF-8;

  3. 修改全部JSP頁面的Content-Type的包含字符集名:

    通常的JSP頁面: <%@page contentType="text/html; charset=UTF-8" %> XML語法的頁面(aka JSP Documents): <jsp:directive.page contentType="text/html; charset=UTF-8" />

  4. 修改全部的servlet設置響應的content type和在content type中include的字符集都設置爲UTF-8

    response.setContentType("text/html; charset=UTF-8") or response.setCharacterEncoding("UTF-8").

  5. 修改內容生成模板庫(Velocity, Freemarker, etc.)使用UTF-8,並指定它們生成的響應的content type爲UTF-8;

  6. 禁用全部可能在編碼設置過濾器或JSP頁面設置Content type 爲UTF-8以前訪問請求參數的過濾器


###CASE 當在JSP頁面使用<%@ page contentType="text/html; charset=UTF-8" %>時,頁面GET請求的參數在地址欄以UTF-8編碼;

charset="UTF-8"時的編碼

當使用<%@ page contentType="text/html; charset=GBK" %>時,頁面GET請求的參數在地址欄以GBK編碼。

charset="GBK"時的編碼

當不加這一句時,瀏覽器地址欄將以&#Unicode編碼顯示;

此處輸入圖片的描述

  • 以上JSP文件以UTF-8編碼格式在磁盤存儲
  • 若是JSP文件保存編碼格式和頁面中ContentType的charset編碼格式不一致,頁面顯示內容會亂碼
  • Tomcat容器默認使用的ISO-8859-1對請求內容進行編碼,因此要對獲取的參數值先用ISO-8859-1進行解碼,而後再使用charset設置的編碼格式進行編碼

JSP頁面中使用<%@ page pageEncoding="UTF-8"%>,JSP文件按照指定編碼格式保存文件,若是沒有這句,則使用ContentType中指定的編碼格式。

相關文章
相關標籤/搜索