我正在使用Ant构建tar.gz存档:
<tar destfile="${linux86.zip.file}" compression="gzip" longfile="gnu">
<tarfileset dir="${work.dir}/data" dirmode="755" filemode="755"
prefix="${app.folder}/data"/>
</tar>
存档是基于Windows构建的。在Ubuntu 12上提取文件后,其名称包含非拉丁文(例如,西里尔文)字符的名称已被破坏。
有没有办法解决或解决这个问题?
答案 0 :(得分:1)
没有。 Tar档案仅支持ascii文件名。请参阅此问题:Creating tar archive with national characters in Java。我认为你需要另一种格式或工具,更现代的设计。
请注意,zip task具有encoding
属性,也许此格式可用?
答案 1 :(得分:1)
我找到了解决方案there,非常感谢Jarekczek,但我并没有正确解码。我修改了脚本如下:
#!/usr/bin/env python
# Huge thanks to https://superuser.com/questions/60379/how-can-i-create-a-zip-tgz-in-linux-such-that-windows-has-proper-filenames#190786
# and http://stackoverflow.com/questions/12456560/encoding-of-filenames-containing-non-latin-characters-while-extracting-from-tar
import tarfile
import codecs
import sys
def recover(name):
return codecs.decode(name, 'cp1251')
for tar_filename in sys.argv[1:]:
tar = tarfile.open(name=tar_filename, mode='r', bufsize=16*1024)
updated = []
for m in tar.getmembers():
m.name = recover(m.name)
updated.append(m)
tar.extractall(members=updated)
tar.close()
我所做的是使用Python的标准库编解码器和命令行界面将名称从Windows解码为utf,以便为其提供档案名称。
答案 2 :(得分:0)
我在Ant的开发者邮件列表(30 Jun 2009,01 Jul 2009)和ASF Bugzilla(36851,53811)中找到了一些有趣的信息。问题是古老而众所周知的,主要是出于意识形态的原因尚未解决,因为并非所有的实施都支持这一点。
Bugzilla问题中提到的修补程序已应用于修订版1350857。 tar中的条目名称有一个编码名称的构造函数:
public TarOutputStream(OutputStream os, String encoding) { ... }
但它从未在Tar任务中使用过。所以我在Tar任务中创建了一个编码属性,从修改后的源中重建了Ant,并使用UTF-8作为条目名称的编码。
在Ubuntu 11/12和Mandriva下进行了提取测试。