字符编码JSP在JSP中显示错误但在URL中不显示:“á»Ã¡é»Ã©”

时间:2008-12-17 13:48:01

标签: jsp tomcat encoding utf-8 jboss

我在JBoss Application Server上运行的JSP中有这个Web应用程序。我正在使用Servlets for friendly urls。我通过我的JSP和Servlet发送搜索参数。我正在使用带有文本框的表单,Servlet

第一个Servlet使用request.getParameter()来获取文本,并将其发送到另一个具有response.sendRedirect的Servlet(将URL屏蔽为“友好”的内容)。这个最终的Servlet使用request.getRequestDispatcher().forward()以“丑陋”的方式将参数发送到JSP:searchResults.jsp?searchParameters=Parameters

现在,当显示“搜索结果”页面时,URL会显示带有“友好网址”的正确搜索字词。示例:http://site.com/search/My-Search-Query即使使用特殊字符,例如:http://site.com/search/Busqué-tildes-y-eñies。但是当我尝试在JSP中使用该搜索词时,特殊字符无法正确显示。

整个系统使用i18n,到目前为止我们对特殊字符没有任何问题。但是当信息通过表单发送时(例如从index.jsp发送到searchResults.jsp),特殊字符没有正确显示:

á - á
é - é
í - Ã
ó - ó
ú - ú
ñ - ñ

整个代码库应该是UTF-8,但显然我在传递参数时遗漏了一些东西。正如我所说,它们正确地显示在URL中,但不在JSP内部。

我正在考虑手动转换á,但我想有更好的方法可以正确地使用正确的编码。此外,以后可能会有新的角色,我现在可能不知道(法语,西班牙语等)

以防万一,我会告诉你我在每个JSP上都有这些行:

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

修改

感谢您的回答。我试了几件事,但没有解决问题。

这就是我所做的:

  • 我添加了一个ServletRequestListener,它将会话的字符编码设置为UTF-8,并为每个Http请求设置一个Filter,它也是如此。

  • 正如我所说,JSP中的所有内容都使用UTF-8进行编码(请参阅相关标题)。

  • 我将Servlets的字符编码打印到控制台,默认情况下为null,将它们设置为UTF-8,如@kgiannakakis和@saua所说。

这些操作都没有解决问题。我想知道这是否有其他问题......

10 个答案:

答案 0 :(得分:11)

尝试在{jboss.server} /deploy/jboss-web.deployer/server.xml中设置URIEncoding。

例如:

<Connector port="8080" address="${jboss.bind.address}"    
     maxThreads="250" maxHttpHeaderSize="8192"
     emptySessionPath="true" protocol="HTTP/1.1"
     enableLookups="false" redirectPort="8443" acceptCount="100"
     connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8" />

答案 1 :(得分:7)

只是一个疯狂的猜测。在JSP / Servlet中尝试这个:

if(request.getCharacterEncoding() == null) {
   request.setCharacterEncoding("UTF-8");
}

您需要确保将正确的编码传递给您的servlet。

答案 2 :(得分:5)

response.setCharacterEncoding( “UTF-8”);

答案 3 :(得分:3)

问题是浏览器发送的信息没有明确定义的编码,HTTP中无法指定它。

幸运的是,大多数浏览器都会使用包含表单的页面的编码。因此,如果您在所有页面中使用UTF-8,那么大多数浏览器也会以UTF-8编码方式发送所有数据(并且您的示例表明它正是如何发送的。)

不幸的是,最常见的Java应用程序服务器并没有真正处理这种情况(不能怪他们,无论如何都是猜测)。

您可以通过调用

告诉应用程序服务器将任何输入视为UTF-8
request.setCharacterEncoding("UTF-8");

根据您的编码风格和您使用的框架,可能会在控制流到达您的代码时延迟,因此可以在javax.servlet.Filter中执行此操作。

答案 4 :(得分:3)

查看tomcat配置中的连接器设置。您可以设置一个选项(URIEncoding)将URI视为UTF-8。默认情况下,它们被视为ISO-8859-1。

答案 5 :(得分:3)

我们遇到了类似的问题。当所有JSP都使用UTF-8 BOM保存时,它就解决了。

答案 6 :(得分:1)

首先,我不知道如何来解决这个问题,因为我对Java和JSP了解不多。

话虽如此:表格右侧的字符是左侧的UTF-8编码。 也就是说,在你的代码中的某个地方,你将字节解释为Latin-1(或者你的默认编码是什么),它们实际上代表了UTF-8编码的字符...

答案 7 :(得分:1)

我认为问题可能是浏览器没有将表单帖子指定为utf-8。关于网页上的表单帖子和编码有很多内容,多个Web框架提供了字符编码过滤器来“修复”这个问题,可能就像你想要修复一样 - 例如参见http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/web/filter/CharacterEncodingFilter.html

答案 8 :(得分:1)

您使用RequestDumper吗?如果在deploy / jboss-web.deployer / server.xml中配置它,则尝试删除它,然后测试您的编码。

答案 9 :(得分:0)

要配置三个图层。根据您的描述,听起来您的问题在于数据库配置。

  1. 浏览器显示和表单提交
  2. JSP

    <%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
    

    HTML

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    
    1. 网络服务器处理
    2. JSP

      <%
        request.setCharacterEncoding("UTF-8");
        String name = request.getParameter("NAME");
      %>
      

      Servlet中的相同类型的东西。请参阅this answer中的JBoss特定解决方案以及完整的服务器独立解决方案。

      1. 数据库设置
      2. 您可能正在丢失数据库级别的字符信息。检查以确保您的数据库编码也是UTF-8,而不是ASCII。

        有关此主题的完整讨论,请参阅Java文章Character Conversions from Browser to Database