经过多次尝试和错误,我仍然无法找出问题所在。 JSP、servlet 和数据库都设置为接受 UTF-8 编码,但即使如此,每当我对任何具有两字节字符(如破折号)的内容使用 request.getParameter 时,它们都会被打乱为损坏的字符。
我已经手动提交到数据库,它能够接受这些字符,没有问题。如果我从 servlet 中的数据库中提取文本并以 jsp 页面的形式打印它,那么它不会显示任何问题。
我发现它以损坏字符的形式返回的唯一一次是当我尝试使用 request.getParameter 检索它后在其他地方显示它时。
还有其他人遇到过这个问题吗?我该如何修复它?
最佳答案
如果请求和/或响应编码根本没有正确设置,就会发生这种情况。
对于 GET 请求,您需要在 servletcontainer 级别进行配置。目前尚不清楚您使用的是哪一个,但例如 Tomcat,这将由 URIEncoding
完成<Connector>
中的属性其 /conf/server.xml
中的元素.
<Connector ... URIEncoding="UTF-8">
对于 POST 请求,您需要创建 filter它映射到涵盖所有这些 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>
对于源代码文件和stdout(IDE控制台),您需要设置IDE工作区编码。目前还不清楚您使用的是哪一个,但对于 Eclipse 来说,可以通过将窗口 > 首选项 > 常规 > 工作区 > 文本文件编码 设置为 UTF-8 来完成。
请注意 HTML <meta http-equiv>
当页面通过 HTTP 提供时,标记将被忽略。仅当通过 file://
从本地磁盘文件系统打开页面时才考虑它。还指定 <form accept-charset>
是不必要的,因为它已经默认使用在使用表单提供 HTML 页面期间使用的响应编码。另请参阅W3 HTML specification .
另请参阅:
关于jsp - 如何将 Unicode 字符作为 JSP/Servlet request.getParameter 传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45686949/