You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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编码,导致读取本地文件名时日文字符被转成问号。

修复步骤
  1. 先验证JVM实际生效的文件编码,在Controller中添加打印语句:
    System.out.println("当前文件编码:" + System.getProperty("file.encoding"));
    System.out.println("当前文件名编码:" + System.getProperty("sun.jnu.encoding"));
    
    若输出值不是UTF-8即可确认问题。
  2. 修改Tomcat的catalina.sh文件,在脚本开头(所有逻辑分支之前,不要放在if/else代码块内部)的JAVA_OPTS配置中追加两个参数,强制指定文件相关编码:
    JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"
    
    修改完成后重启Tomcat服务,再次打印编码参数确认生效即可。
  3. 若为Maven项目,需在pom.xml中明确指定源码编译编码,避免编译阶段硬编码的日文字符串常量被转成乱码:
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>
    
  4. 若部署环境为Linux系统,需额外确认Tomcat进程运行用户的系统locale为UTF-8格式(如en_US.UTF-8、ja_JP.UTF-8),避免操作系统层面返回文件名时就完成了非UTF-8转码。

内容的提问来源于stack exchange,提问作者PrabhuKumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 13:45:30