如何在 Linux 中创建 zip / tgz 以便 Windows 具有正确的文件名?

如何在 Linux 中创建 zip / tgz 以便 Windows 具有正确的文件名?

目前,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=posixPS您可以输入而不是输入-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。

只是哪些工具能够正确支持这些标准,这仍是一个悬而未决的问题。

相关内容