这个具体场景是我们公司的Linux服务器终端的中文突然变成横线了,明明几天前还能正常显示中文的?
总之具体的事故原因也没有排查出来,目前的怀疑是不知道哪个同事跑了什么现成的脚本把环境变量给覆盖了。
但是直接的原因是可以排查出来的:在终端运行locale
命令可以发现所有语言设置都变成了POSIX,而不是UTF-8:
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
说明是Linux系统的问题,而不是我使用的SSH客户端设置有误、字体文件损坏或者别的什么的问题。
在Linux的locale上下文中,POSIX代表一种最简化的“默认”区域设置,它仅支持ASCII字符(无法显示中文等非ASCII字符)。
正常能显示中文的UTF-8环境的输出应该长这样:
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
...
解决方案:
- 临时解决(只对当前终端起作用):
export LANG=zh_CN.UTF-8
- 长久解决:
(需要注意查看~/.bashrc
、~/.bash_profile
、~/.profile
或/etc/profile
中是否覆盖了 LANG 或 LC_* 变量:grep -E "LANG|LC_" ~/.bashrc ~/.bash_profile ~/.profile /etc/profile
确保没有类似export LANG=C
的设置)- 方法一:
- 编辑locale生成列表,取消注释zh_CN.UTF-8
sudo sed -i 's/# zh_CN.UTF-8 UTF-8/zh_CN.UTF-8 UTF-8/' /etc/locale.gen
- 生成locale
sudo locale-gen
- 更新系统Locale默认设置
sudo update-locale LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8
- 编辑locale生成列表,取消注释zh_CN.UTF-8
- 方法二:
echo "LANG=zh_CN.UTF-8" | sudo tee /etc/default/locale
- 方法三:在
/etc/locale.conf
或~/.bashrc
、~/.bash_profile
中添加:LANG="zh_CN.UTF-8"
保存后执行:
(这个就相当于将临时修改环境变量的操作进行了持久化)source ~/.bashrc # 或重启终端 sudo locale-gen zh_CN.UTF-8 # 生成语言环境(Debian/Ubuntu)
- 方法一: