Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Unicode字符作为JSP/Servlet request.getParameter传递?_Jsp_Servlets_Unicode_Character Encoding_Mojibake - Fatal编程技术网

如何将Unicode字符作为JSP/Servlet 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检索它之后尝试在其他地方显示它 还有其

经过反复试验,我仍然不能找出问题所在。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页面期间使用的响应编码。另见

另见:

Tomcat常见问题解答很好地涵盖了这一主题。尤其: 及


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");