JavaEE詳細問題03-サーバとブラウザの符号化復号について


Request-リクエストを受け入れる場合:


取得要求における符号化復号化の問題:
postリクエストの場合、ブラウザは現在のページの符号化に基づいて文字を符号化します.
直接採用します
 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します(ここでは@双城記の指摘に感謝します)

Response-送信に対する応答:


バイトストリームを直接使用して符号化を指定しないと、サーバはデフォルトでシステム符号化を使用して符号化し、ブラウザもシステムデフォルト符号化を使用して復号する
public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    OutputStream os = response.getOutputStream();
    os.write(" ".getBytes());// 
}

=====ブラウザが正常に表示されます====
バイトストリームを使用してエンコーディングを指定し、Httpプロトコルの対応する情報を指定し、ブラウザにバイトストリームをどのようなエンコーディングで解析するかを教えます.
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-8559-1を使用して符号化します.
文字ストリームを使用して漢字を転送する場合は、必ず符号化を設定します.
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(" ");
}