JavaEE細節問題03——關於服務器和瀏覽器的編碼解碼

Request——對於接受請求:

 獲取請求中的編碼解碼問題 :html

                對於post請求,瀏覽器會根據當前頁面的編碼來對字符進行編碼java

                因此咱們 直接採用:數組

 request.setCharacterEncoding("UTF-8");

 對於get請求,瀏覽器自動對字符進行iso-8859-1編碼瀏覽器

 因此咱們拿到之後就要對其進行iso-8859-1解碼,使其成爲本來的字節數組,而後再進行utf-8編碼 服務器

        Enumeration<String> enums = request.getParameterNames();
        while (enums.hasMoreElements()) {
            String name = enums.nextElement();
            String value = request.getParameter(name);
            value = new String(value.getBytes("ISO-8859-1"),"utf-8");
            System.out.println(name+":"+value);
        }

注意:瀏覽器會根據設置的編碼來對url中非保留字符進行encode,在mac osx上,對於中文的url參數會根據utf-8編碼將中文進行encodeURI(這裏感謝@雙城記 對個人指正post

Response——對於發出響應:

    直接使用字節流不指定編碼的話,服務器會默認使用系統編碼進行編碼,瀏覽器也會使用系統默認編碼進行解碼編碼

public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    OutputStream os = response.getOutputStream();
    os.write("我是好人".getBytes());//不指定編碼的話將使用系統默認編碼
}

=====瀏覽器正常顯示====url

使用字節流指定編碼,並指定Http協議的相應信息,告訴瀏覽器用什麼編碼解析字節流spa

public void doPost(HttpServletRequest request, HttpServletResponse response)
    OutputStream os = response.getOutputStream();
    // os.write("我是好人".getBytes());//不指定編碼的話將使用系統默認編碼
    os.write("我也是好人".getBytes("utf-8"));//指定編碼,指定編碼以後一點要在響應頭中指定瀏覽器解析的編碼
    //response.setHeader("Content-Type", "text/html;charset=utf-8");
    response.setContentType("text/html;charset=utf-8");
    //上述兩種均可以
}

        使用字符流不指定編碼的話,服務器會默認使用ISO-8859-1進行編碼.net

因此若是使用字符流傳輸漢字,必定要設置編碼

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    //response.getWriter().write("我是好人");// 不行的,由於默認ISO-8859-1編碼
    response.setCharacterEncoding("utf-8");//設置成utf-8編碼
    response.setHeader("Content-Type", "text/html;charset=utf-8");
    response.getWriter().write("我是好人");
}

而後setContentType("text/html;charset=編碼")setCharacterEncoding和setHeader("Content-Type", "text/html;charset=編碼")的效果

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    //response.getWriter().write("我是好人");// 不行的,由於默認ISO-8859-1編碼
            /*
            response.setCharacterEncoding("utf-8");//設置成utf-8編碼
            response.setHeader("Content-Type", "text/html;charset=utf-8");
            */
    response.setContentType("text/html;charset=utf-8");//這一句能夠達到上面兩句的效果
    response.getWriter().write("我是好人");
}
相關文章
相關標籤/搜索