我刚刚安装了一些 Arch Linux 软件包,它们将此文件转储到我的磁盘上:
/etc/ssl/certs/EBG_Elektronik_Sertifika_Hizmet_Sağlayıcısı.pem
请注意,文件名似乎包含土耳其语字符。以下是不同的命令及其输出:
> cd /etc/ssl/certs
> echo EBG*
EBG_Elektronik_Sertifika_Hizmet_Sağlayıcısı.pem
> ls -al EBG*
lrwxrwxrwx 1 root root 86 Nov 3 22:27 EBG_Elektronik_Sertifika_Hizmet_Sa??lay??c??s??.pem -> /usr/share/ca-certificates/mozilla/EBG_Elektronik_Sertifika_Hizmet_Sa??lay??c??s??.crt
Q1:为什么echo
和ls
产生不同的输出?
所以它是一个符号链接。如果我取消引用它:
> ls -alL EBG*
-rw-r--r-- 1 root root 2106 Sep 24 22:52 EBG_Elektronik_Sertifika_Hizmet_Sa??lay??c??s??.pem
我们来看看目标:
> cd /usr/share/ca-certificates/mozilla
> echo EBG*
EBG_Elektronik_Sertifika_Hizmet_Sağlayıcısı.crt
> ls -al EBG*
-rw-r--r-- 1 root root 2106 Sep 24 22:52 EBG_Elektronik_Sertifika_Hizmet_Sa??lay??c??s??.crt
问题 2:Linux 文件系统(此处为 ext4)中非 ASCII 字符的编码是什么?我说得对吗?编码在任何地方都没有被捕获,如果我给你一些随机硬盘而没有说明,你需要猜一下我使用了哪种编码?
我注意到存在一个问题,因为pacman
(Arch Linux 包管理器)似乎对它是否安装了该文件感到困惑:
问题 3:我如何防止pacman
、 或ls
或其他任何内容对此类文件产生混淆?如果下周某个文件是阿拉伯语或希伯来语而不是土耳其语怎么办?
答案1
echo
是一个愚蠢的程序,无论它认为输出是否有意义,它都会产生输出。ls
是一个聪明的程序,它试图只输出在上下文中有意义的内容。这会导致ls
产生“错误”的输出,因为您没有正确设置语言环境。如果您export LANG=en_US.UTF-8
(或其他使用 utf-8 的语言)那么ls
它将正确显示;通常有一些系统环境脚本可以做到这一点。Linux 文件系统不强制使用编码(但外部安装的文件系统可能会执行编码转换,例如从 cp1252 转换为 FAT),但严格按照惯例始终使用 utf-8。过去几年,如果软件包中使用任何其他编码,则被视为严重错误。
对于
ls
,请修复您的环境。对于pacman
,请提交错误。