先确认locale是否启用:若locale输出lang/lc_ctype/lc_all为c、posix或空,说明未生效;再运行locale -a | grep zh_cn.utf-8,无输出则需依发行版生成locale——debian/ubuntu取消/etc/locale.gen注释后sudo locale-gen,rhel/centos执行sudo localedef -c -i zh_cn -f utf-8 zh_cn.utf-8,arch编辑locale.gen后sudo locale-gen并写入lang=zh_cn.utf-8到/etc/locale.conf。

locale 输出不是 zh_CN.UTF-8 或 en_US.UTF-8 怎么办
乱码的第一道关卡就是 locale 没生效,不是“设了就完事”,而是得确认它真被加载了。locale 命令输出里,LANG、LC_CTYPE、LC_ALL 任意一项为 C、POSIX 或空值,终端连尝试解析中文的资格都没有。
先查系统是否支持:locale -a | grep zh_CN.UTF-8。如果没输出:
- Debian/Ubuntu:取消
/etc/locale.gen中zh_CN.UTF-8 UTF-8的注释,再运行sudo locale-gen - RHEL/CentOS/Rocky:运行
sudo localedef -c -i zh_CN -f UTF-8 zh_CN.UTF-8(注意-c参数不能省,否则静默失败) - Arch:编辑
/etc/locale.gen后执行sudo locale-gen,再写入LANG=zh_CN.UTF-8到/etc/locale.conf
LC_ALL 优先级最高,会直接覆盖 LANG 和其它 LC_* 变量。调试时可先 unset LC_ALL 排除干扰。
SSH 连上去中文还是乱码
服务端 locale 对了,客户端没对齐,照样显示 ??? 或方块。这不是 Linux 端要“改成中文”,而是客户端必须明确用 UTF-8 解码字节流。
PuTTY:Window → Translation → Remote character set 必须选 UTF-8(不是 GBK,也不是 Automatic)
SecureCRT:Options → Session Options → Appearance → Character Encoding 设为 UTF-8;同时确认 Terminal → Emulation → Terminal 是 xterm 或 linux(非 vt100)
Xshell / FinalShell / Windows Terminal 同理:终端设置里找“字符编码”或“远程字符集”,强制设为 UTF-8。Windows 自带 OpenSSH 连接时,先在 PowerShell 里运行 chcp 65001 切换代码页。
别漏掉 SSH 环境变量透传:本地 ~/.ssh/config 加 SendEnv LANG LC_*,服务端 /etc/ssh/sshd_config 加 AcceptEnv LANG LC_*,改完记得 sudo systemctl restart sshd。
中文文件名显示为 ??? 或乱码
文件内容能 iconv 转,但文件名是内核级字节序列,iconv 完全无效。Linux 存的是 UTF-8 字节,Windows 资源管理器默认按 GBK 解——两边解释规则不一致,必然出错。
解压 ZIP 时文件名乱码,大概率是 Windows 打包时用了 GBK 编码存名:
- 用
unzip -O gbk archive.zip(仅部分unzip版本支持-O) - 更稳的办法是换
7z x archive.zip,7z自动识别常见中文编码 - 已存在的乱码文件名,用
convmv -f gbk -t utf-8 -r --notest /path批量修正(先去掉--notest试运行)
convmv 不处理文件内容,只改文件名字节解释方式。别指望 mv 直接重命名——你看到的 ??? 不是真实名字,而是错误解码后的假象。
终端显示方块但 locale 和 SSH 都对了
locale 和传输链都 OK,却只显示方块,说明字体渲染环节断了。Fontconfig 不会自动扫描任意目录,必须把字体放对位置并刷新缓存。
别用 ~/.fonts/:该路径已弃用,新版本默认不扫描
推荐安装:
- Debian/Ubuntu:
sudo apt install fonts-wqy-zenhei - RHEL 8+:
sudo yum install google-noto-sans-cjk-ttc-fonts - Arch:
sudo pacman -S noto-fonts-cjk
装完必须运行:sudo fc-cache -fv(加 -v 才能看到是否扫到你的字体)
验证:fc-list :lang=zh 应有输出;fc-match sans-serif 应返回含 Noto 或 WenQuanYi 的字体名
GNOME Terminal 等 GUI 终端还需手动指定字体:设置 → 当前配置文件 → 字体 → 取消勾选“使用系统等宽字体”,再选 Noto Sans CJK SC 或 WenQuanYi Micro Hei。











