java web 中文亂碼集合
瀏覽器到伺服器亂碼:
- 解決方案:
1):設定請求頭:request.setCharacterEncoding("utf-8"); 意義: 告訴伺服器,本次請求的請求實體裡面的內容用utf-8字符集解碼(根據本地服 務器裡面的servlet在編寫的時候使用編碼集) 注意: 本次設定只針對請求實體,故而使用get傳參方式,引數包裹在請求行中,無法 被本次設定覆蓋,取出的引數依然是亂碼。
解決辦法:
1)在伺服器的conf目錄下servlet.xml檔案中設定伺服器引數中, 其中有一個Connector標籤,在這個標籤中設定屬性:
useBodyEncodingForURI="true":表示請求實體中的解碼標 準適用於uri(即請求行中的解碼字符集同請求實體) 2)同在servlet.xml檔案中的Connector標籤中設定屬性: URIEncoding="utf-8":表示設定uri的編碼字符集為 “utf-8”標準 注意:伺服器解析request請求會在第一次操作的時候就將裡面的引數以某一編碼集為標準全部解析出來, 造成的結果就是: 在第一次讀取引數以後設定請求編碼,該設定無效,之後如果取到中文發現亂碼之後再 設定編碼集,取到的依然是亂碼
2.伺服器到瀏覽器的亂碼: 解決方案: 1)設定響應頭:response.setHeader("content-type","text/html;charset=utf-8"); 意義:告訴瀏覽器:本次響應解碼使用的編碼集為:utf-8; 本方法最靠譜 2)設定響應編碼集:response.setCharacterEncoding("utf-8"); 意義:告訴伺服器:在本次響應輸出的時候使用utf-8編碼集。 使用環境: 1)ajax:因為ajax返回的結果方法使用的是 response.getWriter().write()方法,輸出的是字串, 使用jsp頁面接收的話,jsp使用的是自身的編碼集(根據設定utf-8 或者iso-8850-1)來解碼,此處如果不顯式地宣告response的輸出 格式,就收到的就是亂碼。 我也不知道預設的輸出使用的編碼集,因為如果預設的是伺服器編碼 集的話,應該就是utf-8,那麼不設定應該也不會亂碼才對。
2)直接往瀏覽器輸出內容:使用的也是response.getWriter().write() 方法,此時應該設定為 response.setCharacterEncoding("gb2312"); gb2312是瀏覽器預設的接收字串的編碼集;
使用過濾器設定編碼集:
package com.cdsxt.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class EncodingFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//將ServletRequest request, ServletResponse response強轉為HttpServletRequest,HttpServletResponse
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
req.setCharacterEncoding("utf-8");
resp.setHeader("content-type", "text/html;charset=utf-8");
chain.doFilter(req, resp);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
設定下載檔名時中文亂碼:
//先將檔名按照伺服器編碼(我的是utf-8)解碼,在通過new String()編碼按照瀏覽器的編碼iso-8859-1
String fileName = new String(new String("住戶資訊表.xls").getBytes("utf-8"),"iso-8859-1");
//設定下載頭
response.setHeader("content-disposition", "attachment;filename="+fileName);