Linux系统怎么设置中文字符集 解决乱码问题
遇到Linux系统中文乱码,先别急着折腾字体或者数据库配置。问题的根源,八成出在字符集环境变量没设对,或者是终端工具的编码没跟上。咱们一步步来,把问题揪出来。 检查当前 LANG 和可用中文 locale 第一步,先看看系统当前的语言环境。打开终端,直接运行: echo $LANG locale -
遇到Linux系统中文乱码,先别急着折腾字体或者数据库配置。问题的根源,八成出在字符集环境变量没设对,或者是终端工具的编码没跟上。咱们一步步来,把问题揪出来。

检查当前 LANG 和可用中文 locale
第一步,先看看系统当前的语言环境。打开终端,直接运行:
echo $LANG
locale -a | grep zh_CN
如果第一行输出是 en_US.UTF-8 或者干脆是空的,那基本可以断定,中文 locale 要么没启用,要么压根就没装。如果第二行命令返回了类似 zh_CN.utf8 或 zh_CN.UTF-8 的结果,那就说明系统里其实有中文包,只是没激活而已。
- CentOS/RHEL 系列:安装中文支持通常用
yum groupinstall "Chinese Support",或者安装基础包yum install glibc-common。一些老版本可能还需要额外安装kde-l10n-Chinese。 - Ubuntu/Debian 系列:执行
sudo apt-get install language-pack-zh-hans安装语言包,然后运行sudo dpkg-reconfigure locales,在弹出的列表里勾选上zh_CN.UTF-8。
这里有个细节要注意:有些系统提供的 locale 名称是小写的 zh_CN.utf8,而不是大写的 UTF-8。设置的时候必须严格匹配,否则像 export LANG=zh_CN.UTF-8 这样的命令就会静默失败,让你白忙活一场。
永久设置 LANG 而不被 SSH 客户端覆盖
很多朋友明明在服务器上配好了 /etc/locale.conf 或 /etc/environment,可一通过 SSH 连上去,又变回英文了。这是怎么回事?
问题往往出在 SSH 客户端身上。像 Xshell、SecureCRT、Windows Terminal 这些工具,默认会把自己的语言环境变量(比如 LANG=en_US.UTF-8)发送给服务器,从而覆盖掉服务器本地的设置。
- 服务器端设置:对于 CentOS/RHEL,在
/etc/locale.conf里写入LANG="zh_CN.UTF-8";对于 Ubuntu,则修改/etc/default/locale文件。改完后别忘了用source命令让配置立即生效(例如source /etc/locale.conf)。 - 关键一步:禁用 SSH 环境变量传递:编辑 SSH 服务端的配置文件
/etc/ssh/sshd_config,找到以AcceptEnv开头的那一行。确保这一行里没有包含LANG和LC_*这类变量。通常的做法是直接注释掉或删除这一整行,比如将AcceptEnv LANG LC_*改为#AcceptEnv LANG LC_*。修改完成后,重启 SSH 服务:CentOS 用sudo systemctl restart sshd,Ubuntu 用sudo systemctl restart ssh。
终端和远程连接工具的编码必须同步
就算服务器端的 LANG 设置得完美无缺,如果你用的终端工具编码不对,屏幕上显示的依然会是方块或者问号。所以,客户端这边也得调对。
- SecureCRT:打开【Options】→【Session Options】。先在【Appearance】里把字体编码选成
UTF-8;然后进入【Translation】标签页,将 “Remote character set” 也改为UTF-8(注意不要选成 “Use font encoding”)。 - Xshell:进入【文件】→【属性】→【终端】,在编码下拉框中选择
UTF-8。同时,在【字体】设置里,确认使用的字体是支持中文的,比如DejaVu Sans Mono或WenQuanYi Zen Hei。 - Windows Terminal 连接 WSL 或远程 Linux:需要在设置的 JSON 配置文件里,确保
"locale": "zh_CN.UTF-8"这一项已设置,并且"fontFace"指定的字体(如"Cascadia Code")已经安装且包含 CJK 字形。
vim 和 less 查看中文文件仍乱码?别漏掉 fileencoding
有时候系统环境都对了,但用 vim 打开某个中文文本还是乱码。这时可以在 vim 的命令模式下输入 :set fileencoding? 查看一下。如果显示的是 latin1 或 iso-8859-1,那就说明 vim 没有自动识别出文件的正确编码。
- 临时解决:在 vim 里输入
:set fileencoding=utf-8,然后保存退出 (:wq) 即可。 - 一劳永逸:在你的用户目录下的
~/.vimrc配置文件中加入下面两行:
set encoding=utf-8
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
这样 vim 就会按顺序尝试用列表中的编码来打开文件,通常就能正确识别中文了。 - 关于 less 命令:
less默认可能不支持 UTF-8 渲染中文。可以设置环境变量export LESSCHARSET=utf-8来修正。同时,也要确保LESS环境变量本身没有禁用颜色或分页功能。
最后提醒一个最容易踩的坑:LANG 环境变量的设置,通常只对新打开的终端会话生效。如果你是在一个已经存在的终端窗口里修改了配置并执行了 source,这个窗口本身的环境可能并不会更新。所以,改完配置后,最稳妥的方式是关闭当前终端,重新登录,或者新开一个标签页再测试。别在旧的窗口里反复尝试,然后怀疑人生。


































