gpt4 book ai didi

java - 写入包含非英文字符的文件名时不正确的 zip 条目,即使使用 Java 7

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:25:42 25 4
gpt4 key购买 nike

我正在尝试开发可以处理包含非英语字符(变音符号、阿拉伯语等)的压缩文件的代码,但压缩文件包含不正确的名称。我正在使用 java 版本 1.7.0_45 因此这不应该是由于提到的错误 here .我将 ZipOutputStream 构造函数的字符集设置为 UTF-8,并且根据 Javadocs,它应该按照我的要求工作。

我确信 zip 文件被正确写入,因为尝试从文件中读取条目给出了正确的文件名(如预期的那样)。

但是,当我尝试使用 Ubuntu 默认的 ArchiveManager/Unzip 工具打开/解压时,文件名被弄乱了。

这是我的代码:

private void convertFilesToZip(List<File> files) {
FileInputStream inputStream = null;
try {
byte[] buffer = new byte[1024];

FileOutputStream fileOutputStream = new FileOutputStream("zipFile.zip");

ZipOutputStream outputStream = new ZipOutputStream(fileOutputStream, Charset.forName("UTF-8"));

for (File file : files) {
inputStream = new FileInputStream(file);
String filename = file.getName();
System.out.println("Adding file : " + filename);
outputStream.putNextEntry(new ZipEntry(filename));

int length;

while ((length = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
outputStream.closeEntry();
}

if(inputStream != null) inputStream.close();
outputStream.close();
System.out.println("Zip created successfully");
System.out.println("=======================================================");
System.out.println("Reading zip Entries");
ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(new File("zipFile.zip")), Charset.forName("UTF-8"));
ZipEntry zipEntry;
while((zipEntry=zipInputStream.getNextEntry())!=null){
System.out.println(zipEntry.getName());
zipInputStream.closeEntry();
}

zipInputStream.close();
} catch (IOException exception) {
exception.printStackTrace();
}
}

文件的输出如下:

Adding file : umlaut_ḧ.txt
Adding file : ذ ر ز س ش ص ض.txt
Adding file : äǟc̈ḧös̈ ẗǚẍŸ_uploadFile4.txt
Adding file : pingüino.txt
Adding file : ÄÖÜäöüß- Español deEspaña.ppt
Zip created successfully
=======================================================
Reading zip Entries
umlaut_ḧ.txt
ذ ر ز س ش ص ض.txt
äǟc̈ḧös̈ ẗǚẍŸ_uploadFile4.txt
pingüino.txt
ÄÖÜäöüß- Español deEspaña.ppt

有没有人成功地实现了我想在这里实现的目标。有人能指出我可能遗漏或做错的地方吗?我尽我所能进行了谷歌搜索,甚至尝试了 Apache Commons Compress,但仍然没有成功。

错误报告中提到该错误已在 Java 7 中解决,那么为什么代码无法运行。

最佳答案

[更新]我终于发现问题不在代码中,而实际上是 Ubuntu 的默认 ArchiveManager。它无法正确识别/提取内容。当 Windows zip 处理程序打开/提取同一文件时,它可以完美运行。

此外,commons-compress除了Java支持的zip、gzip之外,还支持其他一些格式。

http://commons.apache.org/proper/commons-compress/index.html

关于java - 写入包含非英文字符的文件名时不正确的 zip 条目,即使使用 Java 7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20973833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com