15

经过大量的试验和错误,我仍然无法弄清楚问题所在。JSP、servlet 和数据库都设置为接受 UTF-8 编码,但即使我在任何具有任何两字节字符(如 em dash)的东西上使用 request.getParameter 时,它们也会被打乱为损坏的字符。

我已经手动提交到数据库,它能够接受这些字符,没问题。如果我从 servlet 中的数据库中提取文本并以我的 jsp 页面形式打印它,它不会显示任何问题。

我唯一一次发现它作为损坏的字符返回是当我在使用 request.getParameter 检索它之后尝试在其他地方显示它时。

有没有其他人有这个问题?我该如何解决?

4

4 回答 4

24

如果根本没有正确设置请求和/或响应编码,就会发生这种情况。

对于 GET 请求,您需要在 servletcontainer 级别对其进行配置。目前尚不清楚您使用的是哪一个,但例如 Tomcat,这将URIEncoding通过<Connector>/conf/server.xml.

<Connector ... URIEncoding="UTF-8">

对于 POST 请求,您需要创建一个过滤器,该过滤器映射到涵盖所有这些 POST 请求的所需 URL 模式。例如*.jsp,甚至/*。做以下工作doFilter()

request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);

对于 HTML 响应和提交的 HTML 表单输入值的客户端编码,您需要设置 JSP 页面编码。将此添加到 JSP 的顶部(鉴于显示 UTF-8 直接格式 DB 可以正常工作,您可能已经正确完成了它)。

<%@page pageEncoding="UTF-8" %>

或者为了防止在每个 JSP 上复制粘贴,请在以下位置配置一次web.xml

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <page-encoding>UTF-8</page-encoding>
    </jsp-property-group>
</jsp-config>

对于源代码文件和标准输出(IDE 控制台),您需要设置 IDE 工作区编码。目前尚不清楚您使用的是哪一个,但例如 Eclipse,通过将Window > Preferences > General > Workspace > Text File Encoding设置为 UTF-8 来完成。

在此处输入图像描述

请注意,通过 HTTP 提供页面时会忽略<meta http-equiv>HTML标记。只有当页面通过本地磁盘文件系统打开时才考虑。也不需要指定,因为它已经默认为在使用表单提供 HTML 页面期间使用的响应编码。另请参阅W3 HTML 规范file://<form accept-charset>

也可以看看:

于 2012-05-09T13:43:14.270 回答
3

BalusC 的答案是正确的,但我只想补充一点很重要(当然对于 POST 方法)

request.setCharacterEncoding("UTF-8");

在读取任何参数之前调用。这是读取参数的实现方式:

@Override
public String getParameter(String name) {
    if (!parametersParsed) {
        parseParameters();
    }
    return coyoteRequest.getParameters().getParameter(name);
}

如您所见,当您第一次读取任何参数时,会设置一个标志parametersParsed,parseParameters() 方法会解析所有请求的参数并设置编码。来电:

request.setCharacterEncoding("UTF-8");

参数解析后将没有效果!这就是为什么有些人抱怨设置请求的编码不起作用的原因。这里的大多数答案都建议使用 servlet 过滤器并在那里设置字符编码。这是正确的,但也请注意,某些安全库可以在您的过滤器之前读取请求参数(这是我的情况),因此如果您的过滤器在此之后执行,则请求参数的字符编码已经设置并设置 UTF-8 或任何其他将没有效果。

于 2016-08-29T14:45:20.297 回答
1

Tomcat FAQ 很好地涵盖了这个主题。特别是: http ://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q8 和http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q4

FAQ 中给出的测试 JSP 本质上是我多年前通过 Tomcat 修复各种编码问题时使用的 JSP。

于 2012-05-09T13:53:37.077 回答
-1

只是想补充一点,以防其他人犯了和我一样的错误,我忽略了POST 方法

阅读所有这些解决方案并应用于我的代码,但它仍然不起作用,因为我忘记添加method="POST"我的<form>标签

于 2017-07-21T02:01:30.927 回答