[TOC]html
原文:Character Encoding Issuesjava
若是沒有指定具體的字符編碼,servlet會使用ISO-8859-1
來對請求進行編碼。(響應和請求的)HTTP消息體的字符編碼在Content-Type頭字段中指定,好比: Content-Type: text/html; charset=ISO-8859-1
web
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
ISO-8859-1
和ASCII
對字符碼0x20 ~ 0x7E是相互兼容的,大部分網站使用ISO-8859-1做爲默認的查詢字符串(query string);UTF-8
來編碼查詢字符串(query string);####關於POST請求編碼:webapp
Content-Type
頭中指定的編碼方式進行編碼(前提是接收方支持該編碼)。###修改GET請求參數的編碼jsp
ISO-8859-1
做爲整個URL,包括查詢字符串(query string),的默認字符編碼。server.xml
文件下的<Connector>
元素,設置URIEncoding屬性爲具體值,好比:URIEncoding="UTF-8"
;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
請求編碼設置必須在參數被解析以前完成纔有效,一旦解析開始,就沒法逆轉。當第一個獲取參數名或參數值的函數被調用參數解析即被觸發,確保將這個過濾器配置在全部獲取參數名或值的過濾器以前。
###在全部地方使用UTF-8 爲了徹底轉換到UTF-8編碼,須要確保如下的改動:
設置server.mxl中<Connector>元素的URIEncoding="UTF-8";
使用字符編碼過濾器設置默認編碼爲UTF-8;
修改全部JSP頁面的Content-Type的包含字符集名:
通常的JSP頁面: <%@page contentType="text/html; charset=UTF-8" %> XML語法的頁面(aka JSP Documents): <jsp:directive.page contentType="text/html; charset=UTF-8" />
修改全部的servlet設置響應的content type和在content type中include的字符集都設置爲UTF-8
response.setContentType("text/html; charset=UTF-8") or response.setCharacterEncoding("UTF-8").
修改內容生成模板庫(Velocity, Freemarker, etc.)使用UTF-8,並指定它們生成的響應的content type爲UTF-8;
禁用全部可能在編碼設置過濾器或JSP頁面設置Content type 爲UTF-8以前訪問請求參數的過濾器
###CASE 當在JSP頁面使用<%@ page contentType="text/html; charset=UTF-8" %>
時,頁面GET請求的參數在地址欄以UTF-8編碼;
當使用<%@ page contentType="text/html; charset=GBK" %>
時,頁面GET請求的參數在地址欄以GBK編碼。
當不加這一句時,瀏覽器地址欄將以&#Unicode編碼顯示;
- 以上JSP文件以UTF-8編碼格式在磁盤存儲
JSP頁面中使用<%@ page pageEncoding="UTF-8"%>
,JSP文件按照指定編碼格式保存文件,若是沒有這句,則使用ContentType中指定的編碼格式。