UTF-8 字符在 Debian 中无法正确显示

UTF-8 字符在 Debian 中无法正确显示

我的问题的简短描述:
我最近遇到了一个问题,我无法使 bash/nano/irssi/etc 显示“特殊”UTF-8 字符,例如德语变音符号 (äüö)、欧元符号 (€) 和其他一些字符UTF-8 字符,如 ß、§ 等。

我已经尝试过的:

  • dpkg-reconfigure locales并且只生成 en_US.UTF-8
  • 设置LC_ALLLANGLANGUAGE在我的用户和 root 的范围en_US.UTF-8.bashrc
  • 重新安装语言环境和 libx11-data (似乎包含所有语言数据)

当然,在完成所有这些更改后,我通过 ssh 重新登录,甚至尝试重新启动服务器,尽管我知道在 99,9875% 的情况下它不能解决 Linux 中的任何问题。

我的系统信息:
操作系统:Debianstretch -> Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.63-2 x86_64 GNU/Linux
语言环境:v.2.22-7

输出locale

LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
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=en_US.UTF-8

例如打字时A进入控制台并按 Enter 我得到-bash: $'\344': command not found
老实说,我没有想法,有人能帮我解决这个问题吗?

答案1

您已告诉 bash 和其他应用程序您的终端使用 UTF-8 编码。仅当您的终端确实使用 UTF-8 时,这才有效。 Bash 无法决定终端编码,终端可以决定。

如果要使用 UTF-8,请将终端配置为使用 UTF-8。由于您使用的是 SSH,因此您需要将运行 SSH 客户端的任何终端配置为使用 UTF-8。这是大多数现代系统上的默认设置,但显然您的系统不是这样设置的。

您应该避免LC_CTYPE在终端中显式设置:理想情况下终端会设置它。然而,这并不总是有效,尤其是通过 SSH(在许多系统上,SSH 服务器禁止客户端设置LC_CTYPE)。

如果需要设置环境变量,正确的位置是.profile, 不是.bashrc

答案2

听起来好像您正在使用 Linux 控制台(而不是基于 X 的终端仿真器之一),并且它不是在 UTF-8 模式下运行。我将使用此脚本将其打开(并调查其关闭原因):

#!/bin/sh
# send character-string to enable UTF-8 mode
if test ".$1" = ".off" ; then
        printf '\033%%@'
else
        printf '\033%%G'
fi

也就是说,调用脚本utf8,然后输入

utf8 on

为了调查错误消息,我制作了一个这样的脚本,有两种风格(一种采用 UTF-8,另一种采用 ISO-8859-1):

#!/bin/bash
printf "ä\n"
echo "ä"
ä

UTF-8 脚本说

$ ./foo
ä
ä
./foo: line 4: ä: command not found

ISO-8859-1 脚本表示(在使用语言环境使用 UTF-8 编码):

$ ./foo2
./foo2: line 5: $'\344': command not found

重点是bash调整其错误消息以对应于区域设置,并且看到它无法在 UTF-8 区域设置中显示 ISO-8859-1 字符,因此将其显示为八进制数。

相关内容