我们收到了一个 .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 字符。
首先检查
locale -a
当前可用的语言环境。在一些较新的发行版(例如 Debian Bullseye)中,语言环境C.UTF-8
始终可用,您可以直接转到步骤 3。(“locale -a” 输出将显示“.utf8”后缀;这是正常的并且也可以工作,但在实际配置中最好还是使用“.UTF-8”。)
如果列表包含支持 UTF-8 的语言环境,请选择它(实际语言无关紧要)。如果没有,请运行
locale-gen en_US.UTF-8
以添加一个。(此过程在不同的发行版之间有所不同,例如在 Arch 上,您需要编辑“/etc/locale.gen”。)运行
localectl set-locale LANG="xx_XX.UTF-8"
以选择语言环境;这将写入 /etc/locale.conf 或 /etc/default/locale 或一些类似的文件。如果您通过 SSH 使用“unrar” – 请注销,然后重新登录(以刷新环境),并运行
locale
以确保 LANG 配置生效,并locale charmap
确保您的语言环境基于 UTF-8。如果您有一个运行“unrar”的服务——请重新启动整个服务器,或者运行
sudo systemctl set-environment LANG="xx_XX.UTF-8"
并重新启动该服务。