如何正确解压zip中的奇怪字符文件?

如何正确解压zip中的奇怪字符文件?

我是 Linuxverse 的新手,所以如果我问的是标准问题,请理解。

我刚刚使用此链接下载了一个 zip 文件:https://io.genesis-ark.club/common/20240401/三国名将录(2).zip

我第一次使用下载时,下载完成后,wget "https://io.genesis-ark.club/common/20240401/三国名将录(2).zip"我得到了,所以我只是使用重新下载。但是当我想提取 zip 时,我得到了像这样的奇怪输出???????.zipwget "https://io.genesis-ark.club/common/20240401/三国名将录(2).zip" -O mydownload.zip

在此输入图像描述

所以我试图找到如何获取详细信息的zip文件,我在谷歌搜索时找到了它zipinfo mydownload.zip,并且输出对我来说也很奇怪

在此输入图像描述

是否有可能是使用非标准程序(如 rar、zip、7z)压缩造成的?我该如何修复它?我已经尝试过使用unzip -a7zip 但它们都不起作用。

仅供参考:我使用的是 Centos 7.0

根据评论的附加信息:

输出locale charmap

locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
ANSI_X3.4-1968

输出locale

locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LC_CTYPE=UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

答案1

您的语言环境中的字符编码是ANSI_X3.4-1968ASCII 的另一个名称,该字符集只有 128 个不同的字符,美式(AASCII 和 ANSI)英语字符。

它没有任何中国特色。

您之所以进入这样的语言环境,是因为LC_CTYPE环境变量设置为UTF-8,但UTF-8在 CentOS 系统上不是有效的语言环境名称(请参阅 的输出locale -a以获取支持的语言环境列表)。它在极少数系统中是有效的区域设置,一个已知的例外是 Apple macos(以前称为 macOS、OS/X 和 MacOS/X 或 Apple 营销团队在某一天喜欢的任何名称)。

当语言环境类别为 时LC_CTYPE,它涵盖了字符编码除其他事项外,无法找到,它默认为C大多数系统(包括 CentOS)上的区域设置,charmap 是 ASCII。

您的输出locale还显示LANG环境变量设置为en_US.UTF-8

这是您系统上的有效区域设置,该LC_CTYPE区域设置是假的,应该保持未设置,因此,与其他LC_*类别一样,它派生自$LANG,并且en_US.UTF-8区域设置将具有 UTF-8 字符映射,它是 Unicode 的编码其中包含所有已知的存在字符。

您可以通过执行以下操作在 shell 环境中本地解决该问题:

unset -v LC_CTYPE

(假设有一个类似 POSIX 的 shell)

之后您将看到显示的输出locale

LC_CTYPE="en_US.UTF-8"

(双引号表示该值为推断,这里来自$LANGas$LC_ALL未设置)

为了更永久地解决问题,您需要弄清楚是什么设置了该环境变量。

ssh一种可能性是您从 macos 系统登录到该 CentOS 系统,并且您的 macos 系统上的环境包含LC_CTYPE=UTF-8(因为它在那里有效)并且ssh通常默认配置为将本地化变量传递到服务器1 ,该变量最终被传播到 CentOS 系统上的远程 shell 会话。

如果是这种情况,您需要告诉 macos 停止发送变量LC_CTYPE,或者使用可移植到其他系统且不是特定于 macos 的值来发送它。例如,您可以添加:

SetEnv LC_CTYPE=en_US.UTF-8

向您~/.ssh/config发送该变量的特定值。阻止它发送$LC_CTYPE变量可能会更困难或更笨重,因为它可能涉及更改系统范围的ssh_config.您也可以将其作为 Apple 的问题提出,因为它向非 Macos 系统发送虚假的环境变量值显然很麻烦。

你还可以这样做:

env -u LC_CTYPE ssh centos-machine

代替:

ssh centos-machine

确保LC_CTYPE环境变量不会传递给ssh,因此不会传递给远程 shell。


¹ 通​​常通过SendEnv LANG LC_*客户端和AcceptEnv LANG LC_*服务器端的一些配置指令

相关内容