使用Java中的国家字符创建tar存档

时间:2009-09-29 10:25:17

标签: java character-encoding archive tar codepages

您是否知道Java中的某些库/方式可以在适当的Windows国家代码页(例如cp1250)中生成带有文件名的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中提取tar时,国家字符被破坏了。 我也发现了一个奇怪的事情,在Linux波兰国家字符只有在我使用ISO-8859-1时才能正确显示:

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

尽管正确的波兰语代码页是ISO-8859-2,但它也不起作用。 我也试过Windows的Cp852,没有效果。

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

感谢您的建议,

2 个答案:

答案 0 :(得分: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中的字节。

答案 1 :(得分:0)

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

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

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