目前,tar -zcf arch.tgz files/*
文件名采用 UTF 编码,因此 Windows 用户看到的文件名中的所有字符都是乱码非英语,却无能为力。
zip -qq -r arch.zip files/*
有同样的行为。
我如何创建一个 zip / tgz 档案,以便 Windows 用户提取时所有文件名都能正确编码?
答案1
目前,tar 使用 UTF 编码文件名
实际上 tar 根本不对文件名进行编码/解码,它只是按原样将它们从文件系统中复制出来。如果您的语言环境是基于 UTF-8 的(就像许多现代 Linux 发行版一样),那将是 UTF-8。不幸的是,Windows 系统的代码页从来都不是 UTF-8,因此名称总是会出错,除非使用 WinRAR 等允许更改所用字符集的工具。
因此,不可能创建可在不同国家/地区的 Windows 版本及其内置压缩文件夹支持中使用的非 ASCII 文件名的 ZIP 文件。
tar 和 zip 格式的缺点是没有固定或提供的编码信息,因此非 ASCII 字符始终无法移植。如果您需要非 ASCII 存档格式,则必须使用较新的格式之一,例如最近的 7z 或 rar。不幸的是,这些格式仍然不稳定;在 7zip 中您需要切换-mcu
,并且 rar 仍然不会使用 UTF-8,除非它检测到不在代码页中的字符。
基本上,这是一个可怕的混乱,如果你能避免分发包含非 ASCII 字符的文件名的档案,你会好得多。
答案2
下面是我编写的一个简单的 Python 脚本,用于在 Windows 上解压来自 UNIX 的 tar 文件:
import tarfile
archive_name = "archive_name.tar"
def recover(name):
return unicode(name, 'utf-8')
tar = tarfile.open(name=archive_name, 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()
答案3
在 Linux 中使用默认设置(GNU tar)的问题tar
已解决...--format=posix
在创建文件时添加参数。
例如:
tar --format=posix -cf
在 Windows 中,为了提取文件,我使用布斯达。
在https://lists.gnu.org/archive/html/bug-tar/2005-02/msg00018.html它被写成(因为2005!!):
> 我在 ChangeLog 中看到一些关于支持 UTF-8 的内容。
这是什么意思?
> 我发现没有办法创建可以在不同语言环境之间互换的档案
。在创建 POSIX.1-2001 格式的档案(tar --format=posix 或 --format=pax)时,tar 会将文件名从当前语言环境转换为 UTF-8,然后将其存储在档案中。提取时,执行相反的操作。
--format=posix
PS您可以输入而不是输入-H pax
,这样更短。
答案4
POSIX-1.2001 指定了 TAR 如何使用 UTF-8。
自 2007 年起,PKZIP APPNOTE.TXT 中的变更日志版本 6.3.0(http://www.pkware.com/documents/casestudies/APPNOTE.TXT) 指定了 ZIP 如何使用 UTF-8。
只是哪些工具能够正确支持这些标准,这仍是一个悬而未决的问题。