2016-09-27 83 views
1

非常简单的代码:在文件名Unicode字符linux下的Tomcat创建文件

try { 
    new File("/home/user/programm/log/тест1.log").createNewFile(); 
} catch (Exception e) { 
    System.out.println(e); 
} 

当我运行这个简单的Java应用程序,它工作得很好,但是当我运行这个在Tomcat下,这将导致? 1.log文件名。

Environement:

  • 的Ubuntu 14.04
  • Tomcat的8
  • 的Java 8

我已经尝试过: 运行Tomcat的选项:

  • -Dfile。 encoding = UTF-8
  • -Dsun.jnu.encoding = UTF-8

我的语言环境ENV看起来是这样的:

LANG=en_US.UTF-8 
LANGUAGE=en_US:en 
LC_CTYPE="en_US.UTF-8" 
LC_NUMERIC="en_US.UTF-8" 
LC_TIME="en_US.UTF-8" 
LC_COLLATE="en_US.UTF-8" 
LC_MONETARY="en_US.UTF-8" 
LC_MESSAGES="en_US.UTF-8" 
LC_PAPER="en_US.UTF-8" 
LC_NAME="en_US.UTF-8" 
LC_ADDRESS="en_US.UTF-8" 
LC_TELEPHONE="en_US.UTF-8" 
LC_MEASUREMENT="en_US.UTF-8" 
LC_IDENTIFICATION="en_US.UTF-8" 
LC_ALL= 

一些调查

调试到File.createNewFile方法后,我发现本地方法java.io.UnixFileSystem.createFileExclusively调用带有参数charsetName = ANSI_X3.4-1968的String.getBytes方法。在我通过file.encoding和sun.jnu.encoding重新定义它们之前,此编码是默认编码。通过JVisualVm我可以看到这些变量的UTF-8。

回答

1

应该定义环境变量LC_ALL。在我的情况下,我将它设置为LC_ALL = en_US.UTF-8。 我用upstart脚本启动了Tomcat,而java在这个脚本之外没有看到enverinment变量。在我将这个env添加到tomcat.conf后,问题得到修复。

ENV LC_ALL =的en_US.UTF-8

相关问题