ファイル名は実際にはzip .warファイルのUTF-8です。ジッパーは(bytes[] extra
情報として)符号化が追加されていないが
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();
}
。
三つのソリューションは想像のようになります。
- 一つの短いソリューションは、UTF-8ロケールでTomcatを実行するかもしれません。
- 最高ののは、MavenにUTF-8エンコーディングの戦争を構築させることです。 (
<onfiguration><encoding>UTF-8</encoding></configuration>
)
- 変換することによって戦争を修復する。
最初の2つのソリューションでは、私は経験がありません。クイック検索では何も得られませんでした(「エンコーディング」は少しばかりです)。
修理のコードは単純です:あなたがディレクトリに戦争を解凍した場合
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();
}
、特殊文字を含むファイル名が保存されていますか?もう一つは、JAVAが正しいエンコーディングを持つようにすることです。 –
yeah .. unzipがファイル名を打ち消す – alexanoid
これは、オペレーティングシステムに、そのようなエンコードを処理するフォントまたは文字セットがないことを示しています。だからJavaの障害:) –