我们收到了一个 .rar 存档,其中包含许多带有特殊字符 é&€ .... 的文件。我们需要使用 shell 在远程服务器上提取它。
如果我使用unrar x archive/name where/to/extract/
,提取顺利。问题是每个带有特殊字符的文件都会被截断并丢失其扩展名:
vidéo.jpeg => vid
lolèo.pdf => lol
我真的需要保留全名和扩展名。我尝试使用 rar 命令,它使事情变得更糟。知道如何解决这个问题吗?
我们找到的唯一方法是使用 Windows 操作系统提取文件,然后将文件发送到远程服务器......
确保
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"
并重新启动该服务。