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 ä
字符的单个 0xC3
和 0xA4
字节实际上将分别表示为字符 Ã
和 ¤
,另请参见 the ISO 8859-1 codepage。
另见:
更新:抱歉,我忽略了您已经设置了URIEncoding
属性。现在这似乎是 Tomcat 5.0 的特定问题。设置该属性可以解决 Tomcat 7(很可能也是最新的 6)上的问题。我建议升级到更新的 Tomcat 版本。 Tomcat 5.0 已停产多年。
【讨论】:
感谢您的回答!不幸的是我已经这样做了。就像我写的:“Tomcat-HTTP-Connector 在我的帖子中设置为 URIEncoding="UTF-8"。 您知道检查<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时,再次发布项目,编码自动还原问题?