request.getParameter()在java servlet中没有正确显示字符编码

时间:2013-09-30 03:47:44

标签: java jsp servlets struts2 character-encoding

我在java servlet文件中遇到UTF-8的问题。当我在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设置添加到server.xml中的UTF-8。

<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 servlet中编写了以下代码。

if(g_request.getParameter("name") != null){
    g_session.setAttribute(NAME, g_request.getParameter("name"));
}

我还在java servlet中使用request.setCharacterEncoding()方法进行了测试,但它并没有真正起作用。 虽然我尝试了很多方法来解决其他人在stackoverflow中与servlet中的字符编码相关的问题,但直到我才能解决我的问题。

如何正确显示字符编码?提前谢谢。

4 个答案:

答案 0 :(得分:12)

默认情况下,大多数服务器(包括Apache Tomcat服务器)都配置为使用ISO-8859-1进行参数编码。我认为除非你有一个专用的专用服务器实例,否则你不会改变它。因此,程序员的技术是手动编码/解码这些参数。因为您使用的是javascript,所以有encodeURI()encodeURIComponent()内置函数。见How to encode a URL in 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 Form content types

答案 1 :(得分:8)

您是否使用System.out.println测试输出?如果是这样,可能是它没有配置为UTF-8。

请参阅:Can not send special characters (UTF-8) from JSP to Servlet: question marks displayed

同时确保在阅读参数之前运行request.setCharacterEncoding("UTF-8")

答案 2 :(得分:3)

我有类似的错误并解决它使用Servlet过滤器如果您使用的是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,请编写一个servlet过滤器,如:

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);
    }

答案 3 :(得分:0)

我想将评论从f.khantsis扩展到答案,因为事实证明这对我来说很重要。

  

重要提示:请确保先执行此过滤器,然后再执行其他操作,否则它将无法正常工作。

我们的servlet过滤器中的编码设置正确:

    request.setCharacterEncoding("UTF-8");

但是当我在request.getParameter中放置一个断点时,表明我们在设置编码之前正在读取参数。这是在另一个过滤器(csrf)中发生的。此时,编码被冻结,进一步设置无效。这可能取决于服务器,但在我们的案例(Websphere)中就是这种情况。