1. 程式人生 > >Request和Response中文亂碼問題的解決方案和區分

Request和Response中文亂碼問題的解決方案和區分

首先,在剛接觸這個中文亂碼問題的時候,還是比較混亂的,因為針對request和response各自都有自己的解決方案,而且思路相似,方法也很相似,又針對get和post兩種提交方式,分兩種解決中文亂碼的方案;針對response響應,分位元組流和字元流的響應方式,所以,是兩個大的方向,四個小的方向。

 

一:Request物件接收中文資料

1.1Post方式接收中文

 

/**
 *  演示Post方式提交,解決中文亂碼問題
 */
public class RequestDemo extends HttpServlet {
     
    protected
void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 產生亂碼的原因: * post提交的資料在請求體中,request物件接收到資料之後,會將資料放入到request緩衝區,緩衝區有預設編碼:ISO-8859-1:不支援中文; * * 解決方案: * 將request緩衝區的編碼更改就行了 *
*/ request.setCharacterEncoding("UTF-8"); String parameter = request.getParameter("name"); System.out.println("姓名:"+parameter); }

 

1.2get方式提交接收中文

        /**
         * 產生亂碼的原因:
         * get提交的資料在請求行url後面,在位址列其實已經進行了一次編碼(預設:ISO-8859-1:對中文不友好)
         * 
         * 解決方案:
         * 將存入request緩衝區的資料以預設的方式接收,但以UTF-8的方式解碼
         
*/ String name=request.getParameter("name"); String param=new String(name.getBytes("ISO-8859-1"),"UTF-8"); System.out.println("姓名:"+parameter);

 

 二:Response響應資料的時候中文亂碼問題及解決方案

2.1使用位元組流方式響應中文

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        /**
         * 使用位元組流響應中文
         */
        //ServletOutputStream outputStream = response.getOutputStream();
        //outputStream.write("中文".getBytes());
        /**
         * 以上這種方式是否能夠避免不出現中文亂碼問題呢?
         * 不一定:
         * 中文亂碼的產生與中文轉化成位元組陣列和瀏覽器開啟方式(開啟時採用的預設字符集)有關
         * 
         * 解決方案:
         * 將中文轉化成陣列的字符集和瀏覽器開啟時候的字符集一致就行
         */
        
        ServletOutputStream outputStream = response.getOutputStream();
        //設定瀏覽器開啟時預設的字符集
        response.setHeader("Conten-Type", "text/html;charset=UTF-8");
        //設定中文轉換成位元組組的字符集編碼
        outputStream.write("中文大師".getBytes("UTF-8"));

 

 2.2使用字元流的方式響應中文

/**
         * 字元流的方式響應中文
         */
        response.getWriter().print("中文大俠");
        /**
         * 使用上述程式碼向頁面輸出中文是否會產生亂碼?  
         * 一定亂碼  
         * 原因: 
         * 字元流是有緩衝區的,response獲得字元流,response設計預設的緩衝區編碼是ISO-8859-1。 
         * 解決:  設定response獲得字元流緩衝區的編碼字符集(這句話體現在:response.getWriter(),詳情請看API)和
         *                 設定瀏覽器預設開啟時候採用的字符集一致即可。
         * 
         */
        
        // 設定瀏覽器開啟時預設的字符集
        response.setHeader("Conten-Type", "text/html;charset=UTF-8");
        //設定response獲得字元流緩衝區的編碼字符集
        response.setCharacterEncoding("UTF-8");
        //響應到瀏覽器
        response.getWriter().print("胡春春和阿珠");

        //下面是一種簡化的方式(推薦記住和掌握)
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().print("胡春春和阿珠");