web-dev-qa-db-ja.com

HttpServletRequest UTF-8エンコーディング

リクエストからパラメータ(アクセント付き文字)を取得したいのですが、機能しません。ユーザーrequest.setCharacterEncoding( "UTF-8" )を試しましたが、機能しませんでした。

URLDecoder.decode( request.getQueryString(), "UTF-8" )は権利文字を返しますが、request.getParameterValues()は機能しません。誰にもアイデアがありますか?

36
Carvallegro

Paulの提案は最善の行動のように思えますが、それを回避する場合は、URLEncoderまたはURLDecoderはまったく必要ありません。

String item = request.getParameter("param"); 

byte[] bytes = item.getBytes(StandardCharsets.ISO_8859_1);
item = new String(bytes, StandardCharsets.UTF_8);

// Java 6:
// byte[] bytes = item.getBytes("ISO-8859-1");
// item = new String(bytes, "UTF-8");

更新:これは多くの票を得ているので、これは間違いなく解決策ではないというBalusCのポイントを強調したい。それはせいぜい回避策です。人々はこれをすべきではありません。

元の問題の原因は正確にはわかりませんが、URLはすでにUTF-8エンコードされていて、その後再びUTF-8エンコードされたと思われます。

39
VGR

Apache Tomcatを使用している場合、request.setCharacterEncoding("UTF-8")POSTリクエストでのみ機能します。

GETリクエストの場合、URIEncoding="UTF-8"<Connector>server.xmlを追加する必要があります。

詳細は FAQ/CharacterEncoding-Apache Tomcat wiki space をご覧ください。

26
Paul Vargas

まあ、私は私の問題を解決する方法を見つけました、それはより良い解決策ではないと思いますが、うまくいきます。

  String item = request.getParameterValues("param"); // Hélène
  item = URLEncoder.encode( model.getNameItem(), "ISO-8859-1" ); // H%C3%A9l%C3%A8ne
  item = URLDecoder.decode( item, "UTF-8" ); // and finally : Hélène

それが他の誰かを助けることができるなら、私は助けてうれしいです:)

PS:ポール、以前は答えなかったが、すでにそうしていた。とにかく助けてくれてありがとう。

6
Carvallegro