【问题标题】:Character encoding problems with tomcattomcat的字符编码问题
【发布时间】:2012-07-09 18:32:59
【问题描述】:
我在为 Web 应用程序进行字符编码时遇到问题。有一个弹出窗口使用用户输入查询数据库(按姓名搜索人)。问题是重音字符被转换成奇怪的字母,比如ó => ó。这是一个非常标准的问题,但我不知道发生了什么。
我做了什么?
主要关注this。
- 设置在我的 tomcat 上的第一个过滤器
(request&response).setCharacterEncoding("UTF-8");
- 设置每个
web.xml、server.xml 字符编码参数<?xml version='1.0' encoding='utf-8'?>。
- 在连接器中将 URIEncoding 更改为 UTF-8。使用萤火虫,我已经看到内容类型设置为
text/html; utf-8 获取帖子(主要是有问题的帖子)
- 将 jsp 上的元类型和 @page 更改为 UTF-8。
但是我还是有同样的问题,虽然有些问题已经解决了,例如从服务器发送到客户端的一些重音字母显示正确。
我已经安装了 apache2.2 和 tomcat 6。
我不知道还能做什么,也不知道应该在这里发布什么相关信息(如果您需要什么请告诉我)...
提前致谢。
【问题讨论】:
标签:
http
tomcat
character-encoding
【解决方案1】:
确保在数据库和 JDBC 驱动程序级别也正确设置了编码。如何做到这一点取决于 DB 和 JDBC 驱动程序的品牌/版本。有关详细信息,请参阅 DB 和 JDBC 驱动程序特定文档。以 MySQL JDBC 驱动为例,需要在 JDBC 连接 URL 中添加两个特定参数。
顺便说一下,设置 XML 文件编码和元标记对 HTTP 请求/响应编码没有影响。对于基于 JSP/Servlet 的 Web 应用程序,只应最低限度地配置以下内容:
-
对于 HTTP GET 请求,在服务器级别进行配置。在 Tomcat 中,这是通过在 Tomcat 的server.xml 中设置<Connector> 的URIEncoding 属性来完成的。
-
对于 HTTP POST 请求,请使用执行 ServletRequest#setCharacterEncoding() 的过滤器。
-
对于 JSP 生成的 HTTP 响应,在每个 JSP 基础上设置 <%@page%> 的 pageEncoding 属性,或者更好的是,在应用程序范围内设置 web.xml 中的 <page-encoding> 条目。
-
对于 servlet 生成的 HTTP 响应(其中不涉及 JSP!),请使用 ServletResponse#setCharacterEncoding()。
-
最后但同样重要的是,确保您的源代码文件也保存为 UTF-8。确切的配置取决于使用的编辑器。如果是 Eclipse,您可以通过 Window > Properties > General > Workspace > Text File Encoding 来控制它。
另见:
【解决方案2】:
在debian用户的java选项中
/etc/default/tomcat7
我把这个
set JAVA_OPTS=-Djavax.servlet.request.encoding=UTF-8 -Dfile.encoding=UTF-8
那么默认情况下,所有编码似乎都是 UTF-8..
对我来说,这解决了问题。
【解决方案3】:
最后对我有帮助的是this article
我的总结:
将 "URIEncoding="UTF-8" 属性添加到 server.xml 中的连接器。例如,
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>
然后为字符编码添加服务器端过滤器。在 tomcat with spring 的情况下,将以下行添加到 web.xml:
<filter>
<filter-name>charsetFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>charsetFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>