1. 程式人生 > >java中form以post、get方式提交資料中文亂碼問題總結

java中form以post、get方式提交資料中文亂碼問題總結

一:form在前臺以post方式提交資料:

    瀏覽器將資料(假設為“中國”)傳送給伺服器的時候,將資料變成0101的二進位制資料(假設為98 99)時必然要查碼錶,瀏覽器以哪個碼錶開啟網頁,瀏覽器就以哪個碼錶提交資料。資料到達伺服器後,資料(98 99)要封裝到request中,在servlet中呼叫Request的getParameter方法返回的是字串(“中國”),方法內部拿到數字後要轉成字元,一定要查碼錶,由於request的設計者是外國人,所以預設查的是他們常用的ISO8859-1,這就是請求資料產生亂碼的根源。

複製程式碼 程式碼如下:
package com.yyz.request;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//以post方式提交表單
public class RequestDemo extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
         //請求資料的中文亂碼問題
        request.setCharacterEncoding("UTF-8");//客戶端網頁我們控制為UTF-8
        String username = request.getParameter("username");
        //獲取資料正常,輸出資料時可以查閱不同碼錶
        response.setCharacterEncoding("gb2312");//通知伺服器傳送資料時查閱的碼錶
        response.setContentType("text/html;charset=gb2312");//通知瀏覽器以何種碼錶開啟
        PrintWriter out = response.getWriter();
        out.write(username);

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request,response);
}

二:form在前臺以get方式提交資料:

   get方式提交的資料依然是瀏覽器用什麼碼錶開啟就用什麼碼錶傳送。不同的是,以get方式提交資料時,request設定編碼無效。即使設定了UTF-8還是會去查ISO8859-1。得到(? ?),要解決這個問題,需要拿著(??)反向查ISO8859-1,拿到(98 99)後,再去查正確碼錶。

複製程式碼 程式碼如下:
 package com.yyz.request;
 
 import java.io.IOException;
 import java.io.PrintWriter;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
//以get方式提交表單
public class RequestDemo extends HttpServlet {

   public void doGet(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
        //請求資料的中文亂碼問題
       request.setCharacterEncoding("UTF-8");//以get方式提交資料時,request設定編碼無效。即使設定了UTF-8還是會去查ISO8859-1
       String username = request.getParameter("username");
      System.out.println(username);
       byte source [] = username.getBytes("iso8859-1");
       username = new String (source,"UTF-8");
       System.out.println(username);
      

   public void doPost(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
       doGet(request,response);
}

}


三:提交資料中文亂碼問題總結:

1.如果提交方式為post,想不亂碼,只需要設定request物件的編碼即可。

      注意:客戶機資料是以哪種方式提交的,request就應該設成什麼編碼。

2.如果提交方式為get,設定request物件的編碼是無效的,想不亂碼,只能手工轉換。

     String data = "???????";//亂碼字串
     byte source [] = data.getBytes("iso8859-1");//得到客戶機提交的原始資料
     data = new String (data.getBytes("iso8859-1"),"UTF-8");//解決亂碼

     //等同於

    data = new String (source,"UTF-8");

3.get方式的亂碼,還可以通過更改伺服器配置的方式實現。更改Tomact的conf目錄下的server.xml檔案。

      3.1    
      
      
      
      這種方式並不推薦,因為更改了伺服器且並不靈活。

      3.2
     
     
     
      這麼設定後,request的setCharacterEncoding設定什麼編碼,聯結器就用什麼編碼,雖然比上一種更改靈活,但依然會導致我們的應用程式牢牢依賴於伺服器,也不被推薦。

四:最後的最後,提一個小細節:URL地址後面如果跟了中文資料,一定要經過URL編碼。表單提交的引數有中文資料,瀏覽器會自動幫我們編碼,但如果是通過連結直接帶中文引數,瀏覽器是不會幫我們編碼的,這時想通過上述第二種方式解決中文亂碼問題就時靈時不靈了,應該通過URLEncoding.encode(,"UTF-8")先編碼。