WEB開發中的字符編碼問題分析與解決。

轉載自:http://hi.baidu.com/sefrank/item/4e7cf73c8e9e1c24b2c0c596

中文亂碼是web開發初學者最頭疼的問題之一。其實只要瞭解瀏覽器、web容器的編碼機制,就能靈活的解決問題。

一、HTTP請求/響應消息正文的默認編碼
    如果沒有指定字符編碼,Servlet規範要求,採用ISO-8859-1編碼。HTTP(請求或響應)的Content-Type頭字段用來指定字符編碼。例如這樣Content-Type:text/html;charset=ISO-8859-1,其中明確指出,正在使用默認設置(ISO-8859-1)。
    Servlet(JSP頁面)請求的字符編碼處理方式是相同的,但響應的字符編碼有點不同。對於標準語法的JSP頁面,默認響應字符集通常是ISO-8859-1,而對於那些XML語法,它是UTF-8。(這是默認情況,開發人員任何時候都應該明確指定字符編碼)。

二、GET/POST方法的默認編碼
1)GET:
    HTTP查詢字符串(GET方法傳的參數)默認使用US-ASCII字符集。US-ASCII以外的字符必須編碼使用%轉義序列:每個字節被編碼爲一個%加上兩個十六進制數。例如,空格(US-ASCII字符代碼97=0x20)編碼爲%20。
    ISO-8859-1和ASCII在字符編碼爲0x20到0x7E的區間是兼容的,所以他們經常互換使用。大多數瀏覽器採用ISO-8859-1爲默認的字符串編碼。
2)POST:
    HTTP請求和響應消息正文(POST方法傳的內容)的默認編碼是ISO-8859-1)。這是默認情況,前面說過,開發人員應該通過設定消息頭(設定Content-type)來指定編碼方式,大多數瀏覽器都是根據頁面的Content-type來決定POST數據(例如method="post"的表單)的編碼。

三、如何設定POST/GET的編碼
1)GET:
    Tomcat使用ISO-8859-1作爲URL默認的字符編碼,包括查詢字符串(GET方法提交的參數)。
    可以通過修改server.xml來改變默認編碼,在<Connector>元素中添加或修改屬性: URIEncoding="UTF-8" 或者 useBodyEncodingForURI="true"(使用與POST方法相同的編碼)。不推薦修改<Connector>元素,對於帶有中文參數的URL,可以通過編碼解決。
    方式一:
    客戶端: encodeURI(encodeURI(url));//第二次編碼把 "%" 編碼成 "%25";
    後臺解碼: URLDecoder.decode(request.getParameter("name"), "UTF-8");
    方式二:
    客戶端:不做任何處理,照常提交;
    服務端解碼:URLDecoder.decode(URLEncoder.encode(request.getParameter("name"),"ISO-8859-1"),"UTF8");
2)POST:
    大多數情況下,通過設定頁面的Content-type即設定了POST的編碼。HTML: <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> JSP: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>。
    但是也有客戶端沒有明確指定編碼的情況,可以通過在過濾器設定字符編碼的方式解決。tomcat 7中有現成的類可以使用:org.apache.catalina.filters.SetCharacterEncodingFilter 核心代碼就是request.setCharacterEncoding("UTF-8");
    //注意這行代碼必須寫在任何request.getParameter之前,否則不起作用。這種方式在SpringMVC開發中,@ModelAttribute註解已經獲取參數生成了請求參數對象,所以在方法主題中使用將不起作用。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章