我有一些文件/文件夹名称不是 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_ALLen_US.UTF-8 (或者其他任何东西,真的),因为它搞乱了一些其他设置!这无法解决问题,但对我来说只是一个糟糕的解决方法。
另外,为什么/bin/ls
在屏幕上打印字符时 LC_CTYPE 被我的 shell 忽略了?
在 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 字符(无双关语)在屏幕上!
答案1
那是什么locale: Cannot set LC_ALL to default locale: No such file or directory
消息告诉您您尝试使用的区域设置之一不存在。它与环境变量无关$LC_ALL
,只是在基于环境变量初始化本地化的调用返回 NULLlocale
时报告错误,表明无法找到通过各种变量之一配置的区域设置。setlocale(LC_ALL, "")
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
在输出到达终端时启用)将它们呈现为?
.
您可以使用以下命令查看系统上可用区域设置的列表:
locale -a
a4
你可能在那里找不到。如果您希望纸张尺寸为A4,则locale -k LC_PAPER
输出:
height=297
width=210
paper-codeset="UTF-8"
您可能想要使用欧洲语言环境$LC_PAPER
,例如en_GB.UTF-8
.
答案2
locale
可以通过以下方式在 OpenSuse 中修复缺失:
zypper in glibc-locale
en_GB
我需要它在构建MicroOs
图像时使用区域设置kiwi