Java 編碼問題總結
一、實踐原則
1、分頁檔的儲存格式做到與聲明一致
如聲明<%@ page language="java" pageEncoding="utf-8"%>,則該檔案儲存為utf-8格式
2、無論是Get、Post還是JavaScript直接調用,瀏覽器以分頁檔指定的編碼格式提交請求
3、JavaScript的方法如encodeURI、encodeURIComponent等使用utf-8格式編碼資料
二、Http協議和Servlet規範
A、Http協議
1、Get 根據Http協議,Get方法中的uri、queryString等均為iso-8859-1編碼格式
2、Post Post方法中可以使用其他的編碼格式,如utf-8,預設為iso-8859-1
B、Servlet規範
1、ServletRequest
void setCharacterEncoding(String env); 該方法可以用於指定request body中資料的編碼格式,Container根據此格式解析
註:該方法必須在取參數及擷取輸入資料流之前調用,否則無效,即getParamater(String key)和getReader()之前調用
2、ServletResponse
void setCharacterEncoding(String charset);該方法用於設定Container響應輸出資料流的編碼格式,但不指定響應內容格式,Servlet2.4+支援
void setContentType(String type);該方法用於指定響應內容格式,同時可以指定響應輸出資料流格式,如下兩種情況基本等效,不同在於使用A時,瀏覽器將使用預設編碼,B將告訴瀏覽器使用指定編碼:
A、setCharacterEncoding("utf-8"); setContentType("text/html");
B、setContentType("text/html; charset=UTF-8");
以上方法可以重複調用覆蓋以前設定,但應該在輸出之前,如調用getWriter();之前
三、伺服器狀況
當前的不少伺服器對Servlet規範中 void setCharacterEncoding(String env);支援的不夠好,畢竟國外廠商本語是English,可能沒有實現該方法,即使調用了改方法,仍然使用預設的iso-8859-1解析
個人測試了如下伺服器支援:
A、Apache-Tomcat-5.5.12
B、Apache-Tomcat-6.0.18
四、方案總結
A、統一編碼方式,如使用utf-8,在伺服器端用指定的編碼格式解析資料(如果容器不支援,則手工轉碼),然後再指定輸出格式
B、將要提交的英文以外格式的參數先進行轉碼再提交,如encodeURIComponent,伺服器端通過URIDecoder解碼(utf-8格式),處理完成後,或者指定輸出資料流及內容格式為utf-8,或者轉為gb2312,以iso-8859-1送回