13

我在 JBoss 应用程序服务器上运行 JSP 中的这个 Web 应用程序。我正在使用Servlet 来获取友好的 url。我正在通过我的 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 请求添加了一个过滤器,其作用相同。

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

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

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

4

10 回答 10

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" />
于 2009-03-20T19:17:12.350 回答
7

Just a wild guess. Try this inside your JSP/Servlet:

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

You need to be sure that the correct encoding is passed to your servlet.

于 2008-12-17T14:08:35.667 回答
6

response.setCharacterEncoding("UTF-8");

于 2010-09-20T08:31:46.143 回答
4

The problem is that the information sent by the browser hasn't got a well-defined encoding and there's no way in HTTP to specify it.

Luckily most browsers will use the encoding of the page that contains the form. So if you use UTF-8 in all your pages, then most browsers will send all data in UTF-8 encoding as well (and your examples show that that's exactly how it is sent).

Unfortunately the most common Java application servers don't really handle the case (can't blame them, it's mostly guesswork anyway).

You can tell your application server to treat any input as UTF-8, by calling

request.setCharacterEncoding("UTF-8");

Based on your coding style and the frameworks you use, it might be to late when the control flow reaches your code, so it might be possible to do that in a javax.servlet.Filter.

于 2008-12-17T14:15:32.597 回答
3

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

于 2008-12-18T11:17:27.930 回答
3

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

于 2009-01-12T23:14:18.023 回答
1

First off, I have no idea how to solve this, since I don't know much about Java and JSP.

Having said that: the characters on the right-hand side of your table are the UTF-8 encoding of the left-hand side. That is, somewhere in your code, you're interpreting bytes as Latin-1 (or whatever your default encoding is), where they actually represent UTF-8 encoded characters...

于 2008-12-17T14:02:18.207 回答
1

I think the problem might be that the browser does not specify the form post to be utf-8. There is a lot to read about form posts and encodings on the web, multiple web frameworks provide character encoding filters to 'fix' this issue, maybe just like your idea for a fix was - see for example http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/web/filter/CharacterEncodingFilter.html

于 2008-12-17T14:09:19.240 回答
1

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

于 2009-07-15T07:57:33.087 回答
0

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

  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. 网络服务器处理

JSP

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

Servlet 中的相同类型的事物。请参阅此答案中的 JBoss 特定解决方案以及完整的服务器独立解决方案。

  1. 数据库设置

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

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

于 2015-01-16T19:15:17.157 回答