从Ant tar任务打包的.tar.gz中提取时包含非拉丁字符的文件名编码

时间:2012-09-17 09:33:16

标签: linux ant encoding tar

我正在使用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上提取文件后,其名称包含非拉丁文(例如,西里尔文)字符的名称已被破坏。

有没有办法解决或解决这个问题?

3 个答案:

答案 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 200901 Jul 2009)和ASF Bugzilla(3685153811)中找到了一些有趣的信息。问题是古老而众所周知的,主要是出于意识形态的原因尚未解决,因为并非所有的实施都支持这一点。

Bugzilla问题中提到的修补程序已应用于修订版1350857。 tar中的条目名称有一个编码名称的构造函数:

public TarOutputStream(OutputStream os, String encoding) { ... }

但它从未在Tar任务中使用过。所以我在Tar任务中创建了一个编码属性,从修改后的源中重建了Ant,并使用UTF-8作为条目名称的编码。

在Ubuntu 11/12和Mandriva下进行了提取测试。