在Java中使用全国性字符创建tar档案

问题描述:

您是否知道一些Java库/路径,以便在适当的Windows国家代码页(例如cp1250)中生成带有文件名的tar档案。在Java中使用全国性字符创建tar档案

我试图与Java tar,示例代码:

final TarEntry entry = new TarEntry(files[i]); 
String filename = files[i].getPath().replaceAll(baseDir, ""); 
entry.setName(new String(filename.getBytes(), "Cp1250")); 
out.putNextEntry(entry); 
... 

它不工作。在Windows中提取焦油的地方,国家字符被破坏。 我还发现了一个奇怪的东西,在Linux下波兰语字符显示正确,只有当我用ISO-8859-1:

entry.setName(new String(filename.getBytes(), "ISO-8859-1")); 

尽管适当波兰代码页ISO-8859-2,其中不起作用。 我也试过Windows的Cp852,没有效果。

我知道tar格式的限制,但改变它不是一个选项。

感谢您的建议,

正式地,TAR不支持标头中的非ASCII。但是,我能够在Linux上使用UTF-8编码的文件名。

你应该试试这个,

String filename = files[i].getName(); 
byte[] bytes = filename.getBytes("Cp1250") 
entry.setName(new String(bytes, "ISO-8859-1")); 
out.putNextEntry(entry); 

这至少保持在TAR头在CP1250的字节数。

+0

非常感谢!有用。 在Windows中解包后的国家字符都可以。 我必须看看构造''新字符串(filename.getBytes(“Cp1250”),“ISO-8859-1”)''并正确理解它。 – pawelsto 2009-09-30 08:37:55

+1

你必须阅读TAR代码才能看到它的工作原理。 TAREntry不理解编码。它只是将UTF-16字符的低位字节复制到TAR文件。在Unicode中,低位字节完全映射到Latin-1,所以我们使用Latin-1来保存字节数组。它完全与拉丁-1编码无关。 – 2009-09-30 12:22:02

tar在其标头中不允许使用非ASCII值。如果您尝试使用不同的编码,结果可能会达到目标平台决定对这些字节值做什么。这听起来像是你的目标平台的tar程序正在将字节解释为ISO-8859-1,这就是为什么'有效'。

看看扩展属性? http://www.freebsd.org/cgi/man.cgi?query=tar&sektion=5&manpath=FreeBSD+8-current

我不是这里的专家,但这似乎是将任何非ASCII值放入tar文件头的唯一官方方式。