我有一些不是 7 位干净的文件/文件夹名称,它们在我的 openSUSE 系统中没有正确显示。
文件夹 /music/Gabriel_Fauré 的示例:
# ls -1d /music/Gabriel_Faur?
/music/Gabriel_Faur??
也许语言环境LC_CTYPE
没有设置为某个 UTF-8 值?
# locale
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_NUMERIC=en_US.UTF-8
LC_TIME=en_GB.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=en_GB.UTF-8
LC_MESSAGES=en_US.UTF-8
LC_PAPER=a4
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=
LC_CTYPE
好吧,我认为这对 Unicode 来说很好!错误信息说什么?
有趣的是,设置LC_ALL
为 的确切值LC_CTYPE
将起作用:
# setenv LC_ALL en_US.UTF-8
# ls -1d /music/Gabriel_Faur?
/music/Gabriel_Fauré
但是,我不想将 LC_ALL 设置为 en_US.UTF-8 (或任何东西,真的),因为它会弄乱其他一些设置!这不是解决办法,但对我来说只是一个糟糕的解决方法。
/bin/ls
另外,为什么在将字符打印到屏幕时,和/或我的外壳会忽略 LC_CTYPE ?
在 Arch Linux 中,我会检查是否生成了语言环境,但在 openSUSE 中我没有发现任何关于该主题的内容。此外,语言环境似乎确实存在。
编辑:
# ls -1d /music/Gabriel_Faur? | hexdump -C
00000000 2f 6d 75 73 69 63 2f 47 61 62 72 69 65 6c 5f 46 |/music/Gabriel_F|
00000010 61 75 72 c3 a9 0a |aur...|
00000016
所以它是正确的 UTF-8(据我所知)。
编辑2:
# locale -a | grep en_US
en_US
en_US.iso885915
en_US.utf8
# locale -a | wc -l
495
EDIT3(正确答案后):
# unsetenv LC_PAPER
# unsetenv LC_ALL
# ls -1d /*/Gabriel_Faur?
/music/Gabriel_Fauré
该LC_PAPER=a4
变量可防止 UTF-8 编码的 Unicode 字符在屏幕上打印(没有双关语) !
该
locale: Cannot set LC_ALL to default locale: No such file or directory
消息告诉您的是,您尝试使用的语言环境之一不存在。这与$LC_ALL
环境变量无关,locale
只是在setlocale(LC_ALL, "")
基于环境变量初始化本地化的调用返回 NULL 时报告错误,表明LC_*/LANG
无法找到通过各种变量之一配置的语言环境。在这里,由于它适用于
LC_ALL=en_US.UTF-8
覆盖所有其他的,所以问题必须与LC_PAPER=a4
.a4
不是系统上有效区域设置的名称,导致setlocal(LC_ALL, "")
失败。失败时
setlocale()
,行为默认为 C 语言环境,其中字符编码为 ASCII。在 C 语言环境中,每个字节都是一个字符,但 0xc3 和 0xa9 是未知的,因为它们不是 ASCII,因此ls -q
(并且-q
在输出到终端时启用)将它们呈现为?
.您可以通过以下方式查看系统上可用语言环境的列表:
你可能不会
a4
在那里找到一个。如果您希望纸张尺寸为 A4,则locale -k LC_PAPER
输出:您可能希望对 . 使用欧洲语言环境
$LC_PAPER
,例如en_GB.UTF-8
.