如何将Unicode字符作为JSP/Servlet request.getParameter传递?
经过反复试验,我仍然不能找出问题所在。JSP、servlet和数据库都设置为接受UTF-8编码,但即使在我对任何具有任何两个字节字符(如em破折号)的对象使用request.getParameter时,它们也会被置乱为断字符 我已经手动提交到数据库,它能够接受这些字符,没有问题。如果我从servlet中的数据库中提取文本,并以jsp页面的形式打印出来,它就不会显示任何问题 我唯一一次发现它以断字符的形式返回时,是在使用request.getParameter检索它之后尝试在其他地方显示它如何将Unicode字符作为JSP/Servlet request.getParameter传递?,jsp,servlets,unicode,character-encoding,mojibake,Jsp,Servlets,Unicode,Character Encoding,Mojibake,经过反复试验,我仍然不能找出问题所在。JSP、servlet和数据库都设置为接受UTF-8编码,但即使在我对任何具有任何两个字节字符(如em破折号)的对象使用request.getParameter时,它们也会被置乱为断字符 我已经手动提交到数据库,它能够接受这些字符,没有问题。如果我从servlet中的数据库中提取文本,并以jsp页面的形式打印出来,它就不会显示任何问题 我唯一一次发现它以断字符的形式返回时,是在使用request.getParameter检索它之后尝试在其他地方显示它 还有其
还有其他人有这个问题吗?如何修复它?如果请求和/或响应编码根本没有正确设置,就会发生这种情况 对于GET请求,需要在servletcontainer级别对其进行配置。不清楚您使用的是哪一个,但例如Tomcat,它将通过其
/conf/server.xml
中
元素中的URIEncoding
属性来完成
对于POST请求,您需要创建一个映射到覆盖所有这些POST请求的所需URL模式上的。例如*.jsp
甚至/*
。在doFilter()
中执行以下操作:
对于提交的HTML表单输入值的HTML响应和客户端编码,需要设置JSP页面编码。将此添加到JSP的顶部(考虑到显示UTF-8直通表单DB工作正常这一事实,您可能已经正确地完成了此操作)
或者,为了防止在每个JSP上复制粘贴,请在web.xml
中配置一次:
*.jsp
UTF-8
对于源代码文件和标准输出(IDE控制台),需要设置IDE工作区编码。现在还不清楚您使用的是哪一种,但在Eclipse示例中,这是通过将Window>Preferences>General>Workspace>Text File Encoding设置为UTF-8来完成的
请注意,当页面通过HTTP提供服务时,HTML
标记将被忽略。仅当通过文件://
从本地磁盘文件系统打开页面时,才会考虑此选项。另外,不需要指定
,因为它已经默认为在使用表单提供HTML页面期间使用的响应编码。另见
另见:
FAQ中给出的测试JSP本质上就是我几年前在Tomcat中修复各种编码问题时使用的JSP。BalusC的答案是正确的,但我只想补充一点,这很重要(当然对于POST方法而言) 在读取任何参数之前调用。以下是读取参数的实现方式:
@Override
public String getParameter(String name) {
if (!parametersParsed) {
parseParameters();
}
return coyoteRequest.getParameters().getParameter(name);
}
如您所见,当您第一次读取任何参数时,会设置一个标志parametersParsed,使用parseParameters()方法解析所有请求的参数并设置编码。
电话:
request.setCharacterEncoding("UTF-8");
参数解析后将不起作用!这就是为什么有些人抱怨设置请求的编码不起作用。
这里的大多数答案建议使用servlet过滤器并在那里设置字符编码。这是正确的,但也要注意,某些安全库可以在筛选之前读取请求参数(这是我的情况)因此,如果在设置请求参数的字符编码之后执行筛选,则设置UTF-8或任何其他都将无效。只想添加一点,以防其他人犯下与我相同的错误,我忽略了POST方法。
阅读所有这些解决方案并应用到我的代码中,但它仍然不起作用,因为我忘记在我的
标签中添加method=“POST”
,客户机是否也向服务器发送UTF-8编码的内容?我相信是的,但我如何确定?
@Override
public String getParameter(String name) {
if (!parametersParsed) {
parseParameters();
}
return coyoteRequest.getParameters().getParameter(name);
}
request.setCharacterEncoding("UTF-8");