2

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

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

4

3 回答 3

1

不,Tar 档案只支持 ascii 文件名。请参阅此问题:Creating tar archive with national characters in Java。我认为您需要具有更现代设计的另一种格式或工具。

请注意,zip 任务具有encoding属性,也许这种格式可以工作?

于 2012-09-18T09:06:32.857 回答
1

我在那里找到了解决方案非常感谢 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,以向其提供档案的名称。

于 2014-04-03T07:06:33.907 回答
0

我在 Ant 的开发者邮件列表(2009 年 6 月 30 日、2009年7 月 1 日)和 ASF Bugzilla(36851、53811 )中找到了一些有趣的信息。这个问题是老生常谈的,主要是出于意识形态的原因,它没有得到解决,因为并非所有的 untar 实现都支持它。

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

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

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

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

于 2012-09-18T15:15:16.823 回答