使用RequestDispatcher时为什么UTF-8在html页面中不起作用?怎么解决?

时间:2015-08-28 01:57:58

标签: java html servlets encoding utf-8

我有一个页面,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árioouemailindisponÃ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”)而不是请求,问题仍然存在。

2 个答案:

答案 0 :(得分:1)

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

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

<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>

答案 1 :(得分:1)

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

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

尽管如此,问题仍然存在。然后我才意识到显而易见:“它正在运行JAVA”,所以我按下CTR + 5打开Netbeans中的服务,转到服务器,右键单击Apache Tomcat,选择属性,转到平台并添加到VM选项:-Dfile.encoding=UTF-8

此外,无法仅使用filters.SetCharacterEncodingFilter作为头等舱部署网络应用,我必须将其更改为org.apache.catalina.filters.SetCharacterEncodingFilter

结论:

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