Java 为什么在使用RequestDispatcher时UTF-8不能在html页面中工作?如何修复它?

Java 为什么在使用RequestDispatcher时UTF-8不能在html页面中工作?如何修复它?,java,html,servlets,encoding,utf-8,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">

我有一个页面,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>
在此之前,我做了:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
    ...
}
还有,这个问题没有答案


编辑:我已经改为响应。setCharacterEncoding(“UTF-8”)而不是请求,问题仍然存在。

更正,您的问题是重定向问题,您可以检查一些解决方案,特别是提到使用的解决方案

通过在
webapp
部分中修改您的
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> 

字符集
filters.SetCharacterEncodingFilter
编码
UTF-8
您还应该添加一个过滤器映射,以指定应用它的位置

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

字符集
*.html

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

首先,我不熟悉Tomcat和Java中的Web开发,所以我不知道用dvhh的答案修改什么“Web.xml”文件(我已经检查过了,Tomcat默认在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

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

结论:

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

您可以使用
curl-I从命令行检查服务器头中的编码吗http://server/path
,或通过web开发工具/web检查器。顺便说一下,您的代码设置的是请求编码,而不是响应编码。您只设置了请求正文的字符编码,而不是响应正文的字符编码。我已更改,问题仍然存在。RequestDispatcher忽略编码。这似乎是一个bug(在任何地方都没有解决方案)。抱歉修改了answe,为了适应您的问题,代码对重定向的目的地编码没有影响,更像是服务器/web应用程序配置问题。在“apache-tomcat-8.0.24”中的“webapps”文件夹中,有三个文件夹包含带有“web.xml”的文件夹“web-INF”其中包括:“根”、“主机管理器”和“管理器”。我已经将你的代码片段包含在所有的应用程序中,但问题依然存在(在“管理器”应用程序中,Tomcat不再构建该应用程序)。它应该是你自己的web应用程序的web.xml。我终于解决了这个问题,并添加了一个额外的答案来解释缺失的内容。非常感谢你的帮助!
<filter-mapping>
    <filter-name>CharSet</filter-name>
    <url-pattern>*.html</url-pattern>
</filter-mapping>