2

您是否知道 Java 中的某些库/方法可以在适当的 Windows 国家代码页中生成带有文件名的 tar 存档(例如 cp1250 )。

我尝试使用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,但它也不起作用。我也试过 Cp852 for windows,没有效果。

我知道 tar 格式的局限性,但改变它不是一种选择。

感谢您的建议,

4

2 回答 2

1

正式地,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 中的字节。

于 2009-09-29T11:57:12.060 回答
0

tar 不允许在其标头中包含非 ASCII 值。如果您尝试不同的编码,结果可能取决于目标平台决定如何处理这些字节值。听起来您的目标平台的 tar 程序将字节解释为 ISO-8859-1,这就是“有效”的原因。

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

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

于 2009-09-29T10:40:54.617 回答