2015-08-28 40 views
0

我有一个页面,并用UTF-8:为什么在使用RequestDispatcher时UTF-8在html页面中不起作用?如何解决它?

<!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鸥电子邮件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”)而不是请求,并且问题仍然存在。

+0

您能检查服务器标题中的编码吗?无论是从'curl -I http:// server/path'命令行还是通过web开发工具/ web检查器。顺便说一句你的代码设置了请求编码而不是响应。 – dvhh

+0

您刚刚设置了请求正文的字符编码,而不是响应正文的字符编码。 – BalusC

回答

1

纠正,你的问题是重定向,你可以检查一些解决方案here,特别是提到使用SetCharacterEncodingFilter的一个。

通过修改你web.xmlweb-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> 
+0

我改变了,问题依然存在。 RequestDispatcher忽略编码。这似乎是一个错误(到处都没有解决方案)。 –

+0

抱歉修改了answe,以适应您的问题,代码对重定向的destionation编码没有影响,更像是一个服务器/ web-app配置问题 – dvhh

+0

在“apache-tomcat-8.0.24”里面的“webapps”文件夹内,那里是包含“WEB-INF”文件夹的三个文件夹,其中包含“ROOT”,“主机管理器”和“管理器”。我已经将你的代码片段包含在其中,问题依然存在(对于“经理人”来说,Tomcat不再构建应用程序)。 –

1

经过痛苦的日子里,我终于解决了这个问题。首先,我是Tomcat和Web开发的Java新手,所以我不知道用什么“web.xml”文件修改dvhh的答案(我已经检查过,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

此外,网络应用程序不能部署只与filters.SetCharacterEncodingFilter作为第一级,我不得不将其更改为org.apache.catalina.filters.SetCharacterEncodingFilter

结论:

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