Rob*_*ska 1 java tomcat utf-8 internationalization
我正在将遗留应用程序从ISO-8859-1转换为UTF-8,并且我已经使用了许多资源来确定我需要设置什么才能使其工作.但是,在几次配置,代码和环境更改之后,我的Servlet(在Tomcat 5中)似乎不会将提交的HTML表单内容处理为UTF-8.
这是我为配置设置的内容.
Run Code Online (Sandbox Code Playgroud)[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=
Run Code Online (Sandbox Code Playgroud)<Connector protocol="HTTP/1.1" ... URIEncoding="UTF-8" useBodyEncodingForURI="true"/>
Run Code Online (Sandbox Code Playgroud)<%@ page language="java" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8" %> ... <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
Run Code Online (Sandbox Code Playgroud)public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { if(request.getCharacterEncoding() == null) { request.setCharacterEncoding("UTF-8"); } ...
使用一些调试日志,我知道以下内容:
Run Code Online (Sandbox Code Playgroud)System.getProperty("file.encoding"): "UTF-8" java.nio.charset.Charset.defaultCharset(): "UTF-8" new OutputStreamWriter(new ByteArrayOutputStream()).getEncoding(): "UTF8"
但是,当我使用包含"Битьбаклуши"的输入提交表单时,我会看到以下内容(来自我的日志):
Run Code Online (Sandbox Code Playgroud)request.getParameter("myParameter") = Ð\221иÑ\202Ñ\214 баклÑ\203Ñ\210Ð
我知道请求内容类型是null,所以它在我的servlet过滤器中显式设置为"UTF-8".此外,我正在从终端查看我的日志,我知道其编码也设置为UTF-8.
我在这里错过了什么?还需要为Servlet设置什么以正确处理输入为UTF-8?如果有更多信息可以提供帮助,我很乐意添加更多调试并用它来更新这个问题.
编辑:
我web.xml对CharsetFilter的定义太过分了(低于我的servlet配置和其他过滤器).我将过滤器定义移动到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 -->
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9735 次 |
| 最近记录: |