Tomcat 5.0 使用 UTF-8 编码文件名提供静态资源

Posted

技术标签:

【中文标题】Tomcat 5.0 使用 UTF-8 编码文件名提供静态资源【英文标题】:Tomcat 5.0 serving static resources with UTF-8 encoded filenames 【发布时间】:2011-12-15 01:04:23 【问题描述】:

我尝试在 Suse Linux Enterprise Server 11.2 上设置 Tomcat-Server 版本 5.0.30-27.35。还有一大堆静态资源也应该通过这个 tomcat 提供。 (由于该系统的管理员限制,升级 tomcat-Server 不是一个选项。)问题是,某些文件的文件名带有特殊字符,并且这些文件不是由 Tomcat-Server 交付的 - 例如。在浏览器(wget、FF、IE、Chrome)中访问 http://myserver/qm-iso/aä.html 时出现 HTTP 404 错误。 (文件/qm-iso/aä.html存在)

我的设置:

Linux 服务器设置为 UTF-8。

Tomcat 以 JAVA_OPTS -Dfile.encoding=UTF8 启动。

在 server.xml 中将 Tomcat-HTTP-Connector 设置为 URIEncoding="UTF-8" <connector ... URIEncoding="UTF-8">

Default-Servlet 在 web.xml 中有一个 init-param fileEncoding

<init-param><param-name>fileEncoding</param-name><param-value>UTF-8</param-value></init-param>

我设置了一个 Test-JSP,它打印出<%= System.getProperty("file.encoding") %><%= (new OutputStreamWriter(new ByteArrayOutputStream())).getEncoding() %> - 都显示 UTF-8。

当访问 URL http://myserver/qm-iso/aä.html 时,我已将 tomcat-log-level 设置为调试和读取这些日志记录语句

Attributes
javax.servlet.forward.request_uri : /qm-iso/a%C3%A4.html
javax.servlet.forward.context_path : 
javax.servlet.forward.servlet_path : /qm-iso/aä.html
javax.servlet.forward.path_info : /error.html
javax.servlet.error.request_uri : /qm-iso/a%C3%A4.html
javax.servlet.error.servlet_name : default
javax.servlet.error.status_code : 404
javax.servlet.error.message : /qm-iso/a%C3%A4.html

在我看来,logentry javax.servlet.forward.servlet_path 显示错误的 enoding aä.html。带有 a%C3%A4.html 的行似乎编码正确。

任何想法,我可能忘记了什么?知道有什么帮助吗?

理查德

【问题讨论】:

【参考方案1】:

您还需要(让您的管理员)将/conf/server.xml<Connector> 元素的URIEncoding 属性设置为UTF-8

默认情况下它们被解释为 ISO 8859-1,这是一种单字节字符编码。 UTF-8 ä 字符的单个 0xC30xA4 字节实际上将分别表示为字符 ä,另请参见 the ISO 8859-1 codepage。

另见:

Tomcat 5.5 Configuration Reference - The HTTP Connector

更新:抱歉,我忽略了您已经设置了URIEncoding 属性。现在这似乎是 Tomcat 5.0 的特定问题。设置该属性可以解决 Tomcat 7(很可能也是最新的 6)上的问题。我建议升级到更新的 Tomcat 版本。 Tomcat 5.0 已停产多年。

【讨论】:

感谢您的回答!不幸的是我已经这样做了。就像我写的:“Tomcat-HTTP-Connector 在我的帖子中设置为 URIEncoding="UTF-8"。 您知道检查 设置是否有效的方法吗?是否有某种调试输出可以读取 URIEncoding 设置? 更新:我检查了<Connector ... URIEncoding="UTF-8"> 的工作方式,URL 的 QUERY-String-Part 在 UTF-8 中正确编码/解码,但服务器/文件名-部分网址不是。 对不起,我忽略了。也许这是 Tomcat 5.5 的特定问题。 URIEncoding 设置在 Tomcat 7 上为我做了这件事。我改变了答案。

以上是关于Tomcat 5.0 使用 UTF-8 编码文件名提供静态资源的主要内容,如果未能解决你的问题,请参考以下文章

IDEA统一设置编码为utf-8编码及tomcat 乱码问题的解决

配置Tomcat的server.xml编码为UTF-8时,再次发布项目,编码自动还原问题?

tomcat设置utf-8编码,springMVC后台接收参数反而乱码

tomcat编码问题

Tomcat相关

tomcat的编码方式