我正在将旧版应用程序从ISO-8859-1转换为UTF-8,并且已经使用了许多资源来确定需要设置哪些才能使其正常工作。但是,在进行了几次配置,代码和环境更改之后,我的Servlet(在Tomcat 5中)似乎没有将提交的HTML表单内容处理为UTF-8。
这是我为配置设置的内容。
[user@server ~]$ locale LANG=en_US.UTF-8 LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL=
<Connector protocol="HTTP/1.1" ... URIEncoding="UTF-8" useBodyEncodingForURI="true"/>
> <%@ page language="java" pageEncoding="UTF-8" > contentType="text/html;charset=UTF-8" %> > ... > <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
> public void doFilter(ServletRequest request, ServletResponse response, > FilterChain chain) > { > if(request.getCharacterEncoding() == null) > { > request.setCharacterEncoding("UTF-8"); > } > ...
通过一些调试日志,我了解以下内容:
> System.getProperty("file.encoding"): "UTF-8" > java.nio.charset.Charset.defaultCharset(): "UTF-8" > new OutputStreamWriter(new ByteArrayOutputStream()).getEncoding(): > "UTF8"
但是,当我使用包含“Битьбаклуши”的输入提交表单时,会看到以下内容(从我的日志中):
> request.getParameter("myParameter") = Ð\221иÑ\202Ñ\214 > баклÑ\203Ñ\210Ð
我知道请求内容类型为null,因此在我的servlet过滤器中将其明确设置为“ UTF-8”。另外,我正在从一个终端查看我的日志,该终端的编码我也知道也设置为UTF-8。
null
我在这里想念什么? 我还需要为Servlet设置什么才能将我的输入正确处理为UTF-8? 如果有更多信息会有所帮助,我将很乐意添加更多调试信息并以此来更新此问题。
编辑:
我web.xml对CharsetFilter的定义太低了(低于我的servlet配置和其他过滤器)。我将过滤器定义移到了web.xml文档的最顶部,一切正常。请参阅下面接受的答案。
web.xml
Edit4 (要求的最终答案和更正的答案)
您的servlet过滤器应用得太晚了。
可能的适当顺序web.xml如下
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2.3.dtd"> <web-app> <!--CharsetFilter start--> <filter> <filter-name>Charset Filter</filter-name> <filter-class>CharsetFilter</filter-class> <init-param> <param-name>requestEncoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <!-- The rest is ommited -->