如何修复 openSUSE Linux 中的 UTF-8/区域设置问题(在终端/文件名和程序对话中)

如何修复 openSUSE Linux 中的 UTF-8/区域设置问题(在终端/文件名和程序对话中)

我有一些文件/文件夹名称不是 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

相关内容