使用 shell 从 rar 档案中提取文件名中含有特殊字符的文件

使用 shell 从 rar 档案中提取文件名中含有特殊字符的文件

我们收到了一个 .rar 档案,其中包含许多带有特殊字符 é&€ ... 的文件。我们需要使用 shell 将其提取到远程服务器上。

如果我使用unrar x archive/name where/to/extract/,提取会很顺利。问题是每个带有特殊字符的文件都会被截断并丢失其扩展名:

vidéo.jpeg  => vid
lolèo.pdf => lol

我确实需要保留全名和扩展名。我尝试使用 rar 命令,但结果更糟。有没有什么办法可以解决这个问题?

我们发现的唯一方法是使用 Windows 操作系统提取文件,然后将文件发送到远程服务器……

答案1

确保该unrar进程在基于 Unicode 的区域设置中运行。

虽然 RAR 档案始终包含以 Unicode 存储的文件名,但 Linux 通常没有强制的文件名编码 - 程序需要查看 $LANG 中的当前系统区域设置并相应地转换名称。

如果没有设置区域设置,则默认为 ASCII,并且unrar一旦遇到系统区域设置无法表示的字符,重新编码就会失败。另一方面,如果区域设置为 UTF-8,那么它可以表示任何Unicode 字符。

  1. 首先检查locale -a当前可用的语言环境。在一些较新的发行版(例如 Debian Bullseye)中,语言环境C.UTF-8始终可用,您可以直接转到步骤 3。

    (“locale -a” 输出将显示“.utf8”后缀;这是正常的并且也可以工作,但在实际配置中最好还是使用“.UTF-8”。)

  2. 如果列表包含支持 UTF-8 的语言环境,请选择它(实际语言无关紧要)。如果没有,请运行locale-gen en_US.UTF-8以添加一个。(此过程在不同的发行版之间有所不同,例如在 Arch 上,您需要编辑“/etc/locale.gen”。)

  3. 运行localectl set-locale LANG="xx_XX.UTF-8"以选择语言环境;这将写入 /etc/locale.conf 或 /etc/default/locale 或一些类似的文件。

  4. 如果您通过 SSH 使用“unrar” – 请注销,然后重新登录(以刷新环境),并运行locale以确保 LANG 配置生效,并locale charmap 确保您的语言环境基于 UTF-8。

    如果您有一个运行“unrar”的服务——请重新启动整个服务器,或者运行sudo systemctl set-environment LANG="xx_XX.UTF-8"并重新启动该服务。

相关内容