のTomcat 8にサーブレットによって復号化することはできません。ISO-8859-1エンコードされたURLが正しく、私はこのような単純なサーブレットを持って
public class MyServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("processedName", request.getParameter("name"));
request.setAttribute("processedQueryString", request.getQueryString());
request.getRequestDispatcher("index.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
私index.jsp
は、このようなものです:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Title</title>
</head>
<body>
<form action="MyServlet" method="get">
Name: <input type="text" name="name">
<input type="submit" value="Submit">
</form>
<br>
After: <%=request.getAttribute("processedName") %>
<br>
Query String: <%=request.getAttribute("processedQueryString") %>
</body>
</html>
フォームにThomás
と入力して送信すると、Thom?s
が印刷されます。
ブラウザでURLやJSPでのクエリ文字列の両方が、ブラウザが正しく%E1
としてISO-8859-1 á
文字をエンコードしているが、何らかの理由で.getParameter
はそれを正しくデコードされていません。name=Thom%E1s
を表示します
ここでは、人々がISO-8859-1以外の文字を提出しようとしたときに(á
と違って)このような投稿が多数見られました。 Tomcat 8はISO-8859-1をデコードのデフォルトとして使うべきではありませんか?
奇妙なことに、accept-charset="UTF-8"
を自分のフォームに入れても機能します。メソッドをmethod="post"
に変更した場合、それは機能します。 accept-charset="UTF-8"
とmethod="post"
の両方を混ぜても機能しません(今はThomás
が印刷されます)。
getメソッドではUTF-8を、postメソッドではISO-8859-1を待っているかのようです。
この記事のガイドを確認してください。http://stackoverflow.com/questions/138948/how-to-get-utf-8-working-in-java-webapps –