SSH 连上服务器,cat 一个日志,中文全变成问号或者菱形块,文件名 ls 出来也是一堆转义符。linux中文乱码基本就两个根源:系统 locale 不是 UTF-8,或者文件本身是 GBK 编码,排查也按这个顺序来。

第一步查 locale

终端里敲 locale,正常应该输出 LANG=zh_CN.UTF-8 或 en_US.UTF-8;显示 POSIX 或 C 说明语言环境没配。看看有哪些可用项用 locale -a,过滤中文就 locale -a | grep zh。

改法按发行版分:CentOS、Rocky 这类用 localectl set-locale LANG=zh_CN.UTF-8,改完重新登录生效;Debian、Ubuntu 先跑 sudo dpkg-reconfigure locales,勾选 zh_CN.UTF-8 生成语言包再设置。临时应急可以 export LANG=zh_CN.UTF-8,只对当前会话有效。

第二步查文件本身的编码

locale 没问题还乱,多半是文件在 Windows 下用 GBK 生成后传上来的。用 file 命令看编码,输出写着 ISO-8859 或 GBK 就对上了,转码一条命令:iconv -f GBK -t UTF-8 old.log -o new.log,转完打开试试。

vim 用户建议在配置里加 set fileencodings=utf-8,gbk,gb2312,让编辑器自动识别;想看当前文件实际编码,命令模式输入 :set fileencoding。

终端这一侧也要对上

本地终端的显示编码必须和服务器一致:Xshell、MobaXterm 在会话属性里把字符编码选成 UTF-8,老版 PuTTY 在 Window 菜单的 Translation 分类里改。两边都是 UTF-8 还乱,就要怀疑字体缺中文字形,换个中文字体再看。

判断思路就一句话:先确认系统 locale 和终端编码统一成 UTF-8,再查单个文件是不是 GBK,linux中文乱码九成落在这两处。老文档建议批量转成 UTF-8 存档,以后跨机器拷贝最少出问题。