从 Ant tar 任务打包的 .tar.gz 中提取时包含非拉丁字符的文件名的编码
Posted
技术标签:
【中文标题】从 Ant tar 任务打包的 .tar.gz 中提取时包含非拉丁字符的文件名的编码【英文标题】:Encoding of filenames containing non-latin characters while extracting from .tar.gz packed by Ant tar task 【发布时间】:2012-09-17 09:33:15 【问题描述】:我正在使用 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 上提取名称包含非拉丁(例如西里尔字母)字符的文件后,名称已损坏。
有什么办法可以解决这个问题吗?
【问题讨论】:
【参考方案1】:没有。 Tar 档案仅支持 ascii 文件名。看到这个问题:Creating tar archive with national characters in Java。我认为您需要另一种格式或工具,具有更现代的设计。
注意zip task 有encoding
属性,也许这种格式可以工作?
【讨论】:
我们使用 tar/gzip 来保留权限。不幸的是,我不能按照你的建议使用 zip。 我明白了。如果这值得,您可以分析在 Ubuntu 上创建的 tar 的内容。然后编写一个程序来编辑 Windows tar 并将文件名转换为适合 Ubuntu 的格式。或者开发自定义解压缩任务来进行文件名转换。焦油格式文档链接自我上面链接的答案。 有人在 Python 中做了类似的事情:superuser.com/questions/60379/…【参考方案2】:我找到了解决方案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://***.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,以向其提供档案的名称。
【讨论】:
【参考方案3】:我在 Ant 的开发者邮件列表(30 Jun 2009、01 Jul 2009)和 ASF Bugzilla(36851、53811)中发现了一些有趣的信息。这个问题很老而且众所周知,主要是出于意识形态的原因,它没有得到解决,因为并非所有的 untar 实现都支持它。
Bugzilla 问题中提到的补丁已应用于修订版1350857。 tar 中的条目名称有一个编码名称的构造函数:
public TarOutputStream(OutputStream os, String encoding) ...
但它从未在 Tar 任务中使用过。所以我在 Tar 任务中做了一个编码属性,从修改后的源代码中重建 Ant,并使用 UTF-8 作为条目名称的编码。
在 Ubuntu 11/12 和 Mandriva 下测试提取。
【讨论】:
很高兴您找到了解决方案。我想发布更多信息,但你更快。无论如何,这是与您的问题相关的另一个错误条目。如果我没看错的话,ant 1.9 中可能有某种编码支持,由longfile="posix"
触发。 Bug 53921.以上是关于从 Ant tar 任务打包的 .tar.gz 中提取时包含非拉丁字符的文件名的编码的主要内容,如果未能解决你的问题,请参考以下文章