代码之家  ›  专栏  ›  技术社区  ›  Community wiki

字符编码JSP-在JSP中显示错误,但在URL:“áé”中没有显示错误

  •  14
  • Community wiki  · 技术社区  · 2 年前

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

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

    现在,当显示“搜索结果”页面时,URL会显示正确的搜索词和“友好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编码的(请参阅有问题的标头)。

    • 我将Servlet的字符编码打印到控制台,默认情况下为空,将它们设置为UTF-8,就像@kgiannakakis和@saua所说的那样。

    这些措施都不能解决问题。我想知道这是否还有其他问题。。。

    10 回复  |  直到 8 年前
        1
  •  11
  •   Rick Rick    17 年前

    尝试在{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" />
    
        2
  •  7
  •   kgiannakakis    17 年前

    只是一个疯狂的猜测。在JSP/Servlet中尝试以下操作:

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

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

        3
  •  6
  •   Scott Cheesle    12 年前

    response.setCharacterEncoding(“UTF-8”);

        4
  •  4
  •   Joachim Sauer    17 年前

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

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

    不幸的是,最常见的Java应用程序服务器并不能真正处理这种情况(不能责怪他们,反正这主要是猜测)。

    您可以通过调用

    request.setCharacterEncoding("UTF-8");
    

    根据您的编码风格和使用的框架,当控制流到达您的代码时可能已经太晚了,因此可以在 javax.servlet.Filter .

        5
  •  3
  •   Stephen Stephen    17 年前

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

        6
  •  3
  •   David David    17 年前

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

        7
  •  1
  •   Arnout    17 年前

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

    话虽如此:表右侧的字符是左侧的UTF-8编码。 也就是说,在代码的某个地方,您将字节解释为Latin-1(或任何默认编码),它们实际上表示UTF-8编码的字符。。。

        8
  •  1
  •   Simon Groenewolt    17 年前

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

        9
  •  1
  •   mgamer    16 年前

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

        10
  •  0
  •   gknicker    8 年前

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

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

    JSP

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

    HTML

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

    JSP

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

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

    1. 数据库设置

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

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