我的问题的简短描述:
我最近遇到了一个问题,我无法使 bash/nano/irssi/etc 显示“特殊”UTF-8 字符,例如德语变音符号 (äüö)、欧元符号 (€) 和其他一些字符UTF-8 字符,如 ß、§ 等。
我已经尝试过的:
dpkg-reconfigure locales
并且只生成 en_US.UTF-8- 设置
LC_ALL
,LANG
并LANGUAGE
在我的用户和 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 字符,因此将其显示为八进制数。