JSP、servlet和数据库都设置为接受UTF-8编码,但即使如此,每当我在任何包含双字节字符(如em破折号)的对象上使用request.getParameter时,它们也会被打乱,成为不完整的字符。
我已经手动提交到数据库,它能够接受这些字符,没有问题。如果我从servlet中的数据库中提取文本,并在jsp页面的表单中打印它,它显示没有问题。
唯一一次我发现它返回时显示为不完整的字符,是在使用request. getParameter检索它之后,我尝试在其他地方显示它。
其他人有过这个问题吗?我该如何解决?
5条答案
按热度按时间roqulrg31#
如果请求和/或响应编码根本没有正确设置,就会发生这种情况。
对于GET请求,你需要在servlet容器级别配置它。不清楚你使用的是哪一个,但是对于Tomcat,这将通过
/conf/server.xml
中<Connector>
元素的URIEncoding
属性来完成。对于POST请求,您需要创建一个filter,它Map到覆盖所有这些POST请求的所需URL模式上。例如
*.jsp
什至/*
。在doFilter()
中执行以下工作:对于HTML响应和提交的HTML表单输入值的客户端编码,您需要设置JSP页面编码。将此编码添加到JSP的顶部(您可能已经正确地完成了此操作,因为显示UTF-8直接表单DB可以正常工作)。
或者,为了防止复制粘贴到每个JSP上,在
web.xml
中配置一次:对于源代码文件和stdout(IDE控制台),您需要设置IDE工作区编码。不清楚您使用的是哪一种,但对于Eclipse,可以通过将 Window〉Preferences〉General〉Workspace〉Text File Encoding 设置为UTF-8来完成。
请注意,通过HTTP提供页面时,忽略HTML
<meta http-equiv>
标记。仅当通过file://
从本地磁盘文件系统打开页面时才考虑它。另外,指定<form accept-charset>
也是不必要的,因为它已经默认为提供表单的HTML页面时使用的响应编码。另请参阅W3 HTML规范。另请参阅:
3pvhb19x2#
BalusC的答案是正确的,但我只想补充一点,这一点很重要(当然是POST方法)
在读取任何参数之前调用。这是阅读参数的实现方式:
正如您所看到的,当您第一次读取任何参数时,会设置一个标志parametersParsed,parseParameters()方法会解析请求的所有参数并设置编码。调用:
这就是为什么有些人抱怨设置请求的编码不起作用的原因。这里的大多数答案建议使用servlet过滤器并在那里设置字符编码。这是正确的,但也要注意,一些安全库可以在您的过滤器之前读取请求参数(这是我的例子)所以如果过滤器是在已经设置了请求参数的字符编码之后执行的,那么设置UTF-8或任何其他编码都不会有任何效果。
jm2pwxwz3#
Tomcat常见问题解答很好地涵盖了这个主题。http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q8http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q4
FAQ中给出的测试JSP实际上就是我几年前在Tomcat中修复各种编码问题时使用的JSP。
zvokhttg4#
只是想补充一点,以防其他人犯了和我一样的错误,我忽略了POST方法
阅读所有这些解决方案并应用到我的代码中,但它仍然不起作用,因为我忘记在我的
<form>
标签中添加method="POST"
gorkyyrv5#
使用如下所述的过滤器:https://www.baeldung.com/tomcat-utf-8
P.S.如果您使用的是JDK 8(它没有默认方法),则可以通过定义空方法“init”和“destroy:
然后,在web.xml中: