其根源在于:Web容器(Tomcat)默認的字符處理編碼是iso-8859-1,對于需要在瀏覽器頁面上顯示中文的JSP程序,
但在程序中并沒有指定中文的字符集,那么中文將在瀏覽器頁面上顯示為亂碼。當然,前面所說的是指在Tomcat服務器下的,其他服務
器有些不是這樣的,比如BEA Weblogic和IBM Websphere是從操作系統中取得默認的編碼,然后按該編碼來轉碼所有用戶請求.Struts中
文問題有三種:發送請求時的中文問題、處理響應結果的中文問題和國際化資源文件的中文問題。
1. 發送請求時的中文問題
客戶機向服務器發送請求時,根據所使用瀏覽器的不同可能會有不同的編碼形式。不過通常情況下在請求到達Web容器前要將之轉碼,
轉成某種固定的編碼以方便Web應用的處理。這種問題有三種處理方法:
第一種(針對Tomcat 5 對POST請求有效,GET請求無效,因為Tomcat 5 對POST和GET請求時分別處理的)可以采用設置用戶請求對象的編碼形式,也就是以HttpServletRequest對象的編碼的形式來進行用戶請求的轉碼:
//將用戶請求轉碼為GB2312、GB18030、GBK、UTF-8 等型,具體轉為什么類型的編碼以您的jsp文件的編碼方式為準,java、jsp 、js 、css應保持一致的編碼方式。這里以GBK為例。
request.setCharacterEncoding("GBK");
第二種(對GET請求有效),可以在Servlet中對用戶輸入的數據進行轉碼。Web容器接受到一個請求時,它會將它發往某個處理的Servlet。在Servlet中直接獲取用戶請求的數據,然后將之轉碼為需要的格式,例如把數據轉換為GBK格式:
String username = request.getParameter("username");
username = new String(username.getBytes("iso-8859-1”), "GBK");
以上兩種方法都是很常用的,但第一種是每個頁面都要去修改,當JSP頁面很多時比較麻煩,第二種就每個發送的數據都要轉碼,也很麻煩。
第三種,就是采用Filter過濾器方式,將用戶的所有請求都通過過濾器進行轉碼,這種方法就克服了以上兩種方法的缺點。代碼如下:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain ) throws IOException, ServletException {
request.setCharacterEncoding("GBK");
//response.setContentType("text/html;charset=GBK");
chain.doFilter(request, response);
}
這里轉碼為GBK過濾器的主要代碼,當然還要把這個類要在web.xml文件中部署。
下一篇 HTML 的優化雜記