【问题标题】:Char set issue in ZipEntry.getName()ZipEntry.getName() 中的字符集问题
【发布时间】:2012-08-06 12:05:18
【问题描述】:

在我的项目中,我有上传 zip 的功能。

当用户上传任何 zip 文件时,我的系统会提取该文件并向用户显示文件夹结构。

如果 zip 文件包含的文件的名称类似于 Õ.txt,那么它将像 O.txt 一样显示。

ZipFile zipFile = new ZipFile(filePath, Charset.forName("UTF8"));
Enumeration entries = zipFile.entries();
while(entries.hasMoreElements())
{

ZipEntry entry = (ZipEntry)entries.nextElement();
System.out.println(entry.getName());

}

以上是我读取 zip 条目的代码。

现在,当我尝试获取条目名称时,它会给我 O.txt 而不是 Õ.txt。

我已经用 JDK 7 测试了这段代码,但结果相同。

我也尝试了不同的编码类型,如 CP437、IBM437、ISO-8859-1 和 ISO-8859-1,但结果没有变化。

所以请建议我在从 zip 文件获取条目时可以支持所有字符的方式

感谢和问候 亚丁

【问题讨论】:

  • Yatin,我认为 java 可以正确读取该文件名,但是您看到输出的控制台不支持 unicode 字符。如果你调试代码,你看到正确的名字了吗?
  • 嗨,是的,我也通过调试器看到了那个东西。感谢和问候 montu v boda
  • 你试过Cp1252编码吗?它适用于我在 JDK6 stackoverflow.com/a/20523390/185565 中使用的 ApacheCommons-compress 库

标签: java unzip


【解决方案1】:

您的环境似乎有问题,不一定是您访问 ZIP 文件的方式。这是一个检查清单:

  • ZIP 文件是否真的包含具有该名称的 UTF-8 编码条目?使用 7-Zip 等工具进行验证。
  • JVM 是否使用正确的字符集?检查系统属性 file.encoding。
  • 您的输出终端/窗口的编码是否与此设置匹配?

毕竟,只有处理链的所有元素都使用正确的设置,结果才是正确的。

【讨论】:

  • 我的问题是如何知道 zip 文件的编码?如果使用 7zip 创建 zip 文件并将该文件上传到我的系统中,那么它工作正常...如果通过任何工具制作 zip 文件,你能建议我该怎么做吗?谢谢和问候
  • ZIP 文件只有两种有效的编码:CP437(约定标准)和 UTF-8(规范标准)。使用什么取决于创建 ZIP 文件的工具 - 并非所有工具都能正确执行。 7-zip 应该可以正常工作。在 JSE 7 之前,Java 做错了(一直使用 UTF-8 但没有在文件中设置适当的位标志)。有关详细信息,请参阅 ZIP 文件格式规范的附录 D,地址为 pkware.com/documents/casestudies/APPNOTE.TXT
猜你喜欢
  • 2010-10-01
  • 1970-01-01
  • 2014-03-24
  • 2012-11-17
  • 2011-04-20
  • 2011-03-19
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多