yuu_nkjm blog


2011-07-30(Sat) [長年日記]

[Servlet][Java] Servletで日本語のリクエストパラメータを取得する

下書き.未検証.暇な時にStringのバイト配列を出力させて,正しいか調べる.

GETによるリクエスト

ISO_8859_1の範囲だとOK

ab cd
↓(ブラウザがGET: UTF-8でエンコード)
ab%20cd
↓(request.getParameter: ISO_8859_1でデコード)
ab cd

HttpServletRequest.getParameterの時にバイト列から文字列に自動で変換されるが,この変換が間違っている.誤った変換を元に戻して(getBytes),正しい変換(new String(byteData, "UTF-8"))をし直す必要がある.

ウィキペディア
↓(ブラウザがGET: UTF-8でエンコード)
%e3%82%a6%e3%82%a3%e3%82%ad%e3%83%87%e3%82%a3%e3%82%a2
↓(request.getParameter: ISO_8859_1でデコード)
文字化けした何か
↓(getBytes: ISO_8859_1でエンコード)
%e3%82%a6%e3%82%a3%e3%82%ad%e3%83%87%e3%82%a3%e3%82%a2
↓(new String(byteData, "UTF-8"))
ウィキペディア

POSTによるリクエスト

public class Sample extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{    
    request.setCharacterEncoding("UTF-8");
    String val = request.getParameter("name");
  }
}

極めてスマートに文字化けが回避出来るのですが、このメソッドではリクエストボディに含まれるデータの文字コードしか設定できません。「POST」メソッドを使った場合にはクライアントから送られてくるパラメータはリクエストボディに含まれるので問題ありませんが、「GET」メソッドを使った場合にはパラメータはURIの部分に含まれています。その為「setCharacterEncoding」メソッドを使ってもパラメータの文字コードの設定は行えませんので注意してください。

本日のリンク元
その他のリンク元
検索

トップ «前の日記(2011-07-23(Sat)) 最新 次の日記(2011-07-31(Sun))» 月表示 編集 設定
2006|01|06|12|
2007|06|09|
2008|01|03|04|06|07|08|09|10|12|
2009|01|02|05|06|07|08|10|11|12|
2010|03|04|05|06|07|08|09|10|11|
2011|01|02|03|04|05|06|07|08|09|11|12|
2012|01|02|04|06|07|08|10|11|12|
2013|01|02|03|07|08|10|11|12|
2014|01|02|04|05|06|07|08|09|10|11|
2015|01|02|07|11|12|
2016|01|03|05|07|08|09|