Tomcat 8 Unicode文件名war文件部署问题

时间:2017-06-03 11:39:07

标签: java tomcat unicode tomcat8 opensuse

在Linux(openSUSE)计算机上,我正在尝试部署Tomcat 8应用程序(war文件),该应用程序包含名称带有Unicode字符的文件。

在war文件中,名称如下:

бжк-природний-1496336830201.xml

但部署后文件如下:

???-?????????????-1496336830201.xml

如何告诉Tomcat正确部署文件名?

已更新

这是一个带有Unicode文件名的示例war文件:war file

这次战争中文件的文件名有什么问题?

已更新

我已按照此处https://superuser.com/questions/1215670/opensuse-unzip-unicode-issue的建议安装了unzip-rcc,现在在WAR文件上解压缩(控制台命令)工作正常,但Tomcat仍会部署具有相同问题的文件。

2 个答案:

答案 0 :(得分:2)

尝试将这些设置放在Tomcat启动脚本中:

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8

根据经验,Java会为不知道如何编码的字符打印上下问号。

答案 1 :(得分:2)

zip .war文件中的文件名确实是UTF-8。

try (ZipFile zipFile = new ZipFile(path, StandardCharsets.UTF_8)) {
    zipFile.stream()
        .forEachOrdered(entry -> System.out.printf("- %s%n", entry.getName()));
} catch (IOException e) {
    e.printStackTrace();
}

但是zip没有添加编码(作为bytes[] extra信息)。

可以想象出三种解决方案:

  • 一个简短的解决方案可能是在UTF-8语言环境下运行TomCat。
  • 最好的方法是让maven用UTF-8编码构建一场战争。 (<onfiguration><encoding>UTF-8</encoding></configuration>
  • 通过转换来修复战争。

前两个解决方案我没有经验。快速搜索没有产生任何东西(&#34;编码&#34;有点无处不在)。

维修代码很简单:

Path path = Paths.get(".../api.war").toAbsolutePath().normalize();
Path path2 = Paths.get(".../api2.war").toAbsolutePath().normalize();

URI uri = URI.create("jar:file://" + path.toString());
Map<String,String> env = new HashMap<String,String>();
env.put("create", "false");
env.put("encoding", "UTF-8");

URI uri2 = URI.create("jar:file://" + path2.toString());
Map<String,String> env2 = new HashMap<String,String>();
env2.put("create", "true");
env2.put("encoding", "UTF-8");

try (FileSystem zipFS = FileSystems.newFileSystem(uri, env);
     FileSystem zipFS2 = FileSystems.newFileSystem(uri2, env2)) {

    Files.walkFileTree(zipFS.getPath("/"), new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
                    throws IOException {
            System.out.println("* File: " + file);
            Path file2 = zipFS2.getPath(file.toString());
            Files.createDirectories(file2.getParent());
            Files.copy(file, file2);
            return FileVisitResult.CONTINUE;
        }
    });

} catch(IOException e) {
    e.printStackTrace();
}