запрос.getParameter() неправильно отображает кодировку символов в Java-сервлете
у меня есть проблема с UTF-8 в файле сервлета java. Когда я получаю значение параметра в URL, у меня есть проблема с символами UTF-8. Он не отображает должным образом японские символы.
заголовок Jsp уже имеет
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
я добавил параметр URIEncoding в соединителе в UTF-8 на сервере.XML.
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
я написал код следующим образом в JSP.
<s:textfield key="txt_name" name="txt_name" id="txt_name"
maxlength="64"></s:textfield>
<a href="javascript:showModalWindow('PopUpFile!init.action?<%=Common.PASSWORD%>=<%=Common.encript(ID, Code)%>','',940,650);">
<s:property value="PopUp Link" />
</a>
<script>
function showModalWindow(x_URL, x_ARG, x_WIDTH, x_HEIGHT) {
var x_OPT = "dialogHeight: " + x_HEIGHT + "px; " + "dialogWidth: "
+ x_WIDTH + "px; "
+ "edge: Raised; center: Yes; resizable: Yes; status: Yes;";
x_URL += "&name="+document.getElementById("txt_name").value;
var retValue = window.showModalDialog(x_URL, x_ARG, x_OPT);
if (retValue != null) {
document.forms.frm.action = "ParentFile!getUser.action";
document.forms.frm.submit();
}
}
</script>
а затем я написал код следующим образом на java сервлет.
if(g_request.getParameter("name") != null){
g_session.setAttribute(NAME, g_request.getParameter("name"));
}
Я также протестировал с request.setCharacterEncoding()
метод в Java servlet, но он действительно не работает.
Хотя я пробовал много способов из ответов на проблему других людей, связанную с кодировкой символов в сервлете в stackoverflow, я не могу решить свою проблему до тех пор.
что я могу сделать, чтобы правильно отобразить кодировку символов? Спасибо заранее.
4 ответов
большинство серверов, включая сервер Apache Tomcat, настроены на кодирование параметров с помощью ISO-8859-1
по умолчанию. Я думаю, что вы не измените это, если у вас есть собственный выделенный сервер. Таким образом, метод программиста заключается в кодировании/декодировании этих параметров вручную. Поскольку вы используете javascript, есть encodeURI()
или encodeURIComponent()
встроенная функция. См.как кодировать URL в JavaScript. Код должен измениться
x_URL += "&name="+encodeURI(document.getElementById("txt_name").value);
в Java используйте URLDecoder
для декодирования параметра обратно.
java.net.URLDecoder.decode(((String[])request.getParameterMap().get("name"))[0], "UTF-8"));
Примечание, Если вы используете Struts2 dispatcher
тип результата, тогда вам не нужно декодировать параметры в строке запроса. Эти параметры анализируются через UrlHelper
.
однако я не помню, когда я декодирую эти параметры автоматически декодируются в Struts2.
как правило, вы должны знать, что если вы передаете параметры в URL, они должны быть закодированы URL. Если вы отправляете форму, нет необходимости делать это, потому что форма x-www-form-urlencoded
см. 17.13.4 типы содержимого формы.
вы тестируете выход с помощью System.out.println
? Если это так, возможно, что он не настроен для UTF-8.
это: не удается отправить специальные символы (UTF-8) из JSP в сервлет: отображаются вопросительные знаки
также убедитесь, что вы используете request.setCharacterEncoding("UTF-8")
перед чтением параметров.
у меня есть аналогичная ошибка и решить ее с помощью фильтра сервлетов если вы используете Spring, просто добавьте это определение в web.в XML
<!-- CharacterEncodingFilter / UTF-8 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Если вы не используете Spring, напишите фильтр сервлетов, например:
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
//Set character encoding as UTF-8
request.setCharacterEncoding("UTF-8");
filterChain.doFilter(request, response);
}
Я хотел бы добавить комментарий от Ф.khantsis на ответ, потому что это оказалось важным в моем случае.
важно: убедитесь, что этот фильтр выполняется первым, перед любыми другими, иначе он не будет работать.
у нас была правильная настройка кодировки в нашем фильтре сервлетов:
request.setCharacterEncoding("UTF-8");
но когда я ставлю точку останова в request.getParameter
Он показал, что мы читаем параметры перед установкой кодировки. Это было происходит в другом фильтре (csrf). В этот момент кодировка была заморожена, и ее дальнейшая настройка оказалась неэффективной. Это может зависеть от сервера, но в нашем случае (Websphere) это было так.