У меня проблема в моем веб-приложении на Java.
Вот код в index.jsp:
<%@page contentType="text/html" pageEncoding="UTF-8" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<% request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Hello World!</h1>
<form action="index.jsp" method="get">
<input type="text" name="q"/>
</form>
Res: <%= request.getParameter("q") %>
</body>
</html>
Когда я отправляю запрос, мой браузер отправляет этот заголовок:
GET /kjd/index.jsp?q=%C3%A9 HTTP/1.1\r\n
...
Accept-Charset: UTF-8,*\r\n
И сервер Tomcat возвращает мне это:
Content-Type: text/html;charset=UTF-8\r\n
Но если я отправлю "é" (% C3% A9 в UTF-8) в моей форме, вместо этого будет отображаться "Ã ©".
Что я понимаю, так это то, что браузер отправляет «é» в кодировке UTF-8 (% C3% A9).
Но сервер интерпретирует это как ISO-8859-1. Таким образом,% C3 декодируется как Ã, а% A9 как ©, а затем отправляет обратно ответ, закодированный в UTF-8.
В коде запросы должны быть декодированы с помощью UTF-8:
request.setCharacterEncoding("UTF-8");
Но, если я отправлю этот URL:
http://localhost:8080/kjd/index.jsp?q=%E9
"% E9" декодируется с ISO-8859-1 и отображается "é".
Почему это не работает? Почему запросы декодируются с ISO-8859-1?
Я пробовал это на Tomcat 6 и 7, а также на Windows и Ubuntu.