запрос.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) это было так.