Spring Controller部署于Tomcat7无法读取含日文文件名文件如何解决
问题现象
部署在Tomcat7服务器上的Spring Controller无法读取文件名包含日文字符的文件,通过打印语句输出文件路径时,日文字符对应位置显示为问号。
已尝试操作
- 在Tomcat的
server.xml中配置URIEncoding="UTF-8" - 在
catalina.sh文件中添加编码相关参数 - 在项目
web.xml中配置字符编码过滤器 - 完成上述配置后问题仍未解决
补充信息
相同的文件读取逻辑在普通Core Java应用中可正常运行,能够正常识别读取带日文文件名的文件。
根因分析
之前配置的三类参数均不覆盖JVM读取本地文件系统的编码场景:
URIEncoding="UTF-8"仅作用于HTTP请求URL的解码逻辑- 常规字符编码过滤器仅作用于HTTP请求、响应的报文编解码
- 若
catalina.sh中参数配置位置错误、参数不全,不会对JVM启动参数生效
Core Java应用可正常运行,是因为本地启动时默认继承了当前用户环境的UTF-8编码配置,而Tomcat服务启动时可能读取到系统默认的非UTF-8编码,导致读取本地文件名时日文字符被转成问号。
修复步骤
- 先验证JVM实际生效的文件编码,在Controller中添加打印语句:
若输出值不是System.out.println("当前文件编码:" + System.getProperty("file.encoding")); System.out.println("当前文件名编码:" + System.getProperty("sun.jnu.encoding"));UTF-8即可确认问题。 - 修改Tomcat的
catalina.sh文件,在脚本开头(所有逻辑分支之前,不要放在if/else代码块内部)的JAVA_OPTS配置中追加两个参数,强制指定文件相关编码:
修改完成后重启Tomcat服务,再次打印编码参数确认生效即可。JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8" - 若为Maven项目,需在
pom.xml中明确指定源码编译编码,避免编译阶段硬编码的日文字符串常量被转成乱码:<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties> - 若部署环境为Linux系统,需额外确认Tomcat进程运行用户的系统locale为UTF-8格式(如
en_US.UTF-8、ja_JP.UTF-8),避免操作系统层面返回文件名时就完成了非UTF-8转码。
内容的提问来源于stack exchange,提问作者PrabhuKumar
相关产品推荐
相关产品推荐

