为了账号安全,请及时绑定邮箱和手机立即绑定

如何将Unicode字符作为JSP/Servlet请求程序传递?

如何将Unicode字符作为JSP/Servlet请求程序传递?

胡子哥哥 2019-06-24 13:24:55
如何将Unicode字符作为JSP/Servlet请求程序传递?经过多次反复试验,我仍然找不出这个问题。JSP、Servlet和数据库都被设置为接受UTF-8编码,但即使在任何有两个字节字符(如em破折号)的情况下,只要我使用request.getParameter,它们都会被置乱为断线字符。我已经做了手动提交到数据库,它能够接受这些字符,没有问题。如果我在servlet中从数据库中提取文本并以jsp页面的形式打印它,它就没有问题。唯一次我发现它会以破碎字符的形式返回,那就是在使用request.getParameters检索它之后,我尝试在其他地方显示它。还有其他人有这个问题吗?我怎么才能修好它?
查看完整描述

3 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

我只想补充一点(当然,对于POST方法来说)

request.setCharacterEncoding("UTF-8");

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

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

如你所见,有一面旗帜参数分析这是在第一次读取任何参数时设置的,parseParameters()方法将解析所有请求的参数并设置编码。呼叫:

request.setCharacterEncoding("UTF-8");

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


查看完整回答
反对 回复 2019-06-24
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

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

对于GET请求,需要在servlet容器级别配置它。目前还不清楚您使用的是哪一种,但例如Tomcat,这是由URIEncoding属性<Connector>元素/conf/server.xml.

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

对于POST请求,您需要创建一个滤光器它被映射到所需的URL模式上,涵盖所有这些POST请求。例如:*.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页面时使用的响应编码。


查看完整回答
反对 回复 2019-06-24
  • 3 回答
  • 0 关注
  • 430 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信