JavaEE詳細問題03-サーバとブラウザの符号化復号について
2855 ワード
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(" ");
}