猿问

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

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

经过多次反复试验,我仍然找不出这个问题。JSP、Servlet和数据库都被设置为接受UTF-8编码,但即使在任何有两个字节字符(如em破折号)的情况下,只要我使用request.getParameter,它们都会被置乱为断线字符。

我已经做了手动提交到数据库,它能够接受这些字符,没有问题。如果我在servlet中从数据库中提取文本并以jsp页面的形式打印它,它就没有问题。

唯一次我发现它会以破碎字符的形式返回,那就是在使用request.getParameters检索它之后,我尝试在其他地方显示它。

还有其他人有这个问题吗?我怎么才能修好它?


胡子哥哥
浏览 431回答 3
3回答

阿波罗的战车

我只想补充一点(当然,对于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或任何其他参数都不会产生任何效果。

明月笑刀无情

如果根本没有正确设置请求和/或响应编码,就会发生这种情况。对于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页面时使用的响应编码。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答