1. 程式人生 > >web開發中文亂碼問題總結

web開發中文亂碼問題總結

首先應該明白jsp頁面兩個與編碼有關的引數的作用:
1、pageEncoding:用於指定jsp頁面的編碼格式,
pageEncoding指定檔案儲存的格式,由於JVM內部是使用的unicode編碼格式,容器在編譯JSP時
會根據pageEncoding指定的編碼格式將檔案內容轉換為unicode的格式,
如果沒有指定pageEncoding就預設使用charset的編碼格式

2、contentType="text/html;charset=UTF-8"
charset的作用有兩個,一是從伺服器返回到瀏覽器時,指示瀏覽器以charset指定的編碼格式顯示內容,
另一個作用是,當我們在頁面上填寫完資料提交時,瀏覽器會將資料轉換為charset指定的格式傳給伺服器。
charset預設的編碼格式為ISO-8859-1


post方式傳遞引數

post方式的資料是通過Http請求頭傳給Servlet的,Servet容器在獲取這些資料時,如通過getParameter()方法獲取資料,容器會根據request.getCharacterEncoding()指定的編碼格式來解析接收資料,
如果getCharacterEncoding()==null(預設情況正式如此,http協議沒有傳遞編碼資訊給伺服器)一般就預設使用ISO-8859-1。
如果我們在頁面指定的charset編碼不是ISO-8859-1也沒有通過setetCharacterEncoding()指定編碼格式,那麼亂碼問題就會產生了。
比如你在頁面上面設定charset=UTF-8,現在有一個引數是三個漢字,那麼UTF-8的編碼就會有六個位元組的資料,
此時容器用ISO-8859-1來解析資料,而ISO-8859-1是單位元組的編碼,
本來是兩個字,容器卻解析為六個,亂碼問題由此就產生了。

解決這類亂碼的方法是通過配置一個編碼過濾器來指定編碼格式:

public class EncodingFilter implements Filter {

 public EncodingFilter() {
 }

 public void init(FilterConfig parm1) throws javax.servlet.ServletException {
 }

 public void doFilter(ServletRequest request, ServletResponse response,
   FilterChain chain) throws java.io.IOException,
   javax.servlet.ServletException {

       
  request.setCharacterEncoding("UTF-8");

  chain.doFilter(request, response);
 }

 public void destroy() {
 }
}

url或者get方式傳遞引數
 
  首先應該儘量避免使用這種方式傳遞中文引數,如果需要傳遞中文引數比較可靠的做法
  在傳遞引數時使用URLEncoder.encode()對傳遞的引數進行編碼,然後在引數使用端使用URLDecoder.decode()進行解碼