8

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

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

我该怎么做才能正确显示字符编码?提前致谢。

4

4 回答 4

13

大多数服务器,包括 Apache Tomcat 服务器,默认配置为参数编码ISO-8859-1。我认为除非您拥有私有专用服务器实例,否则您不会更改此设置。因此,程序员的技术是手动编码/解码这些参数。因为您使用的是javascript,所以有encodeURI()encodeURIComponent()内置函数。请参阅如何在 JavaScript 中编码 URL。代码应该改变

x_URL += "&name="+encodeURI(document.getElementById("txt_name").value);

在 Java 中使用URLDecoderto decode 参数返回。

java.net.URLDecoder.decode(((String[])request.getParameterMap().get("name"))[0], "UTF-8"));

注意,如果您使用的是 Struts2dispatcher结果类型,那么您不需要解码查询字符串中的参数。这些参数通过UrlHelper.

但是,我不记得我什么时候解码这些参数是在 Struts2 中自动解码的。

作为一项规则,您应该知道,如果您在 URL 中传递参数,它们应该是 URL 编码的。如果您提交表单,则无需这样做,因为表单是x-www-form-urlencoded,请参阅17.13.4 表单内容类型

于 2013-09-30T08:39:59.403 回答
10

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

请参阅:无法从 JSP 向 Servlet 发送特殊字符 (UTF-8):显示问号

还要确保request.setCharacterEncoding("UTF-8")在读取参数之前运行。

于 2013-09-30T05:53:46.630 回答
4

如果您使用 Spring,我有类似的错误并使用 Servlet 过滤器解决它,只需将此定义添加到 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);
    }
于 2015-05-16T13:34:39.063 回答
0

我想将f.khantsis的评论升级为答案,因为事实证明它对我来说很重要。

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

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

    request.setCharacterEncoding("UTF-8");

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

于 2018-08-30T08:32:50.237 回答