【问题标题】:Why UTF-8 does not work in html page when using RequestDispatcher? How to fix it?为什么使用 RequestDispatcher 时 UTF-8 在 html 页面中不起作用?如何解决?
【发布时间】:2015-11-22 14:13:22
【问题描述】:

我有一个页面,并且 UTF-8 有效:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>:(</title>
        <link rel="stylesheet" href="font-awesome/css/font-awesome.min.css" type="text/css">
        <link href='http://fonts.googleapis.com/css?family=Varela+Round' rel='stylesheet' type='text/css'>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.13.1/jquery.validate.min.js"></script>
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
        <link rel="stylesheet" href="css/bootstrap.min.css" type="text/css">
        <link rel="stylesheet" href="css/login.css" type="text/css">
        <link rel="stylesheet" href="css/creative.css" type="text/css">
    </head>
    <body>
        <div class="text-center" style="padding:50px 0">
            <div class="logo">Usuário ou email indisponíveis :(.</div>
        </div>
    </body>
</html>

尽管如此,当我使用 RequestDispatcher 将用户重定向到此资源时,它完全忽略页面的 UTF-8 编码(消息是葡萄牙语,它显示“Usuário ou email indisponÃveis :(.")。

if (this.hasRecord(connection, (String) requestData.get("reg_username"), (String) requestData.get("reg_email")) == true) {
    RequestDispatcher requestDispatcher = request.getRequestDispatcher("/user_taken.html");
    requestDispatcher.forward(request, response);
} else {
    statement.executeUpdate();
}

在此之前,我做了:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
    ...
}

另外,this 未得到答复。

编辑:我已经更改为 response.setCharacterEncoding("UTF-8") 而不是请求,但问题仍然存在。

【问题讨论】:

  • 您能否检查服务器标头中的编码,无论是从带有curl -I http://server/path 的命令行,还是通过网络开发工具/网络检查器。顺便说一句,您的代码设置的是请求编码而不是响应编码。
  • 您只是设置了请求正文的字符编码,而不是响应正文。

标签: java html servlets encoding utf-8


【解决方案1】:

更正,您的问题出在重定向上,您可以查看一些解决方案 here,尤其是提到使用 SetCharacterEncodingFilter 的解决方案。

通过在web-app 部分中修改您的web.xml

<filter> 
    <filter-name>CharSet<filter-name> 
    <filter-class>filters.SetCharacterEncodingFilter</filter-class> 
    <init-param> 
        <param-name>encoding</param-name> 
        <param-value>UTF-8</param-value> 
    </init-param> 
</filter> 

你还应该添加一个过滤器映射来指定它应该应用在哪里

<filter-mapping>
    <filter-name>CharSet</filter-name>
    <url-pattern>*.html</url-pattern>
</filter-mapping>

【讨论】:

  • 我改了,问题依旧。 RequestDispatcher 忽略编码。这似乎是一个错误(到处都没有解决方案)。
  • 抱歉修改了答案,以适应您的问题,代码对重定向的目标编码没有影响,更像是服务器/Web应用配置问题
  • 在“apache-tomcat-8.0.24”内的“webapps”文件夹内,有三个文件夹包含一个文件夹“WEB-INF”,其中包含一个“web.xml”:“ROOT ”、“主机管理器”和“管理器”。我已将您的 sn-p 包含在所有这些中,但问题仍然存在(在“管理器”的情况下,Tomcat 不再构建应用程序)。
  • 应该是自己web应用的web.xml
  • 我终于解决了这个问题,并且我添加了一个额外的答案来解释缺少的内容。非常感谢您的帮助!
【解决方案2】:

经过几天的磨难,我终于解决了这个问题。

首先,我是 Java 中 Tomcat 和 Web 开发的新手,所以我不知道用 dvhh 的答案修改什么“web.xml”文件(我已经检查过,Tomcat 有 EXACT 过滤器默认情况下在主机管理器文件夹内的 WEB-INF 文件夹内)。然后,他说我必须在自己的 Web 应用程序中进行更改,但是没有 web.xml(所以我意识到我必须创建一个)。我发现可以在 Netbeans 中创建它并很容易地使用 GUI 添加过滤器,所以我做到了(另外,我已经从我的 servlet 源中删除了response.setCharacterEncoding("UTF-8"))。

不过,问题仍然存在。然后我刚刚意识到很明显:“它在 JAVA 上运行”,所以我按 CTR + 5 打开 Netbeans 中的服务,转到服务器,右键单击 Apache Tomcat,选择属性,转到平台并添加到 VM选项:-Dfile.encoding=UTF-8

另外,Web 应用程序不能仅以 filters.SetCharacterEncodingFilter 作为第一类部署,我必须将其更改为 org.apache.catalina.filters.SetCharacterEncodingFilter

结论:

  • 您必须将过滤器和过滤器映射正确添加到 web.xml 您的 Web 应用程序。
  • 您必须使用 -Dfile.encoding=UTF-8 运行 JVM。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 2018-06-11
    • 2011-04-07
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 2019-06-25
    相关资源
    最近更新 更多