终端中文乱码需lang/lc_*、终端编码、字体三者统一为utf-8:先用locale -a确认zh_cn.utf8存在,再在~/.zshrc中设lang和lc_all,最后检查终端编码设置及fc-list :lang=zh验证中文字体。

终端乱码不是单一配置能解决的,核心是 LANG/LC_*、终端模拟器编码、字体三者必须全部对齐 UTF-8(或按需统一为 GBK),漏一个就显示问号或方块。
检查 locale 是否真正支持 zh_CN.UTF-8
只改 LANG=zh_CN.UTF-8 没用,系统得真有这个 locale。运行 locale -a | grep zh_CN,如果没输出或只有 zh_CN.GB18030,说明语言包没生成。
- 编辑
/etc/locale.gen,取消注释zh_CN.UTF-8 UTF-8 - 执行
sudo locale-gen(Debian/Ubuntu)或sudo localedef -c -i zh_CN -f UTF-8 zh_CN.UTF-8(CentOS/RHEL,-c参数不能省,否则静默失败) - 再跑一次
locale -a | grep zh_CN,确认看到zh_CN.utf8(注意小写和点号)
设置环境变量但不污染全局服务
直接改 /etc/environment 或 /etc/profile 可能让 cron、systemd 服务也继承中文 locale,引发日志或脚本解析异常。更稳妥的是只对交互式 shell 生效。
- 在
~/.bashrc或~/.zshrc末尾加两行:export LANG=zh_CN.UTF-8export LC_ALL=zh_CN.UTF-8 - 执行
source ~/.bashrc(或对应 shell 配置文件) - 验证:新开终端后运行
locale,确认LANG和LC_CTYPE都是zh_CN.UTF-8,且LC_ALL不为空
终端模拟器自身必须启用 UTF-8 编码
即使系统 locale 正确,GNOME Terminal、Konsole、Windows Terminal 等若内部编码设成 ISO-8859-1 或“自动检测”,照样乱码。这不是系统问题,是终端自己的设置。
- GNOME Terminal:菜单 → Preferences → Profile → Text → Character encoding → 选
Unicode (UTF-8) - Windows Terminal(连 WSL 或 SSH):设置 JSON 中加
"locale": "zh_CN.UTF-8",并确保"fontFace"使用含 CJK 字形的字体(如Cascadia Code PL、Noto Sans CJK SC) - PuTTY / Xshell / FinalShell:进 Translation 或字符编码设置页,把
Remote character set明确设为UTF-8,不是 “Use font encoding” 或 “Auto”
字体缺失会导致中文显示为空白或方块
locale 和编码全对,但终端用的字体不包含汉字字形,结果就是□□□或空白——这常被误判为编码问题。
- 运行
fc-list :lang=zh,有输出才说明系统已加载中文字体 - 没输出?手动安装字体,例如:
sudo apt install fonts-wqy-microhei fonts-noto-cjk(Debian/Ubuntu)sudo yum install wqy-microhei-fonts noto-cjk(RHEL/CentOS) - GNOME Terminal 设置里勾选“Custom font”,从下拉列表选一个带 “CJK”、“WenQuanYi” 或 “Noto Sans” 的字体
- 别信“DejaVu Sans Mono”能显示中文——它默认不含汉字,仅靠 fallback 渲染不可靠
真正卡住人的从来不是“怎么设”,而是设完没验证 locale -a、没查 fc-list、也没打开终端设置翻到 Translation 页面确认远程字符集。三个环节缺一,中文就还在方块里。特别是 Java 应用或脚本处理中文路径时,JVM 还得额外加 -Dfile.encoding=UTF-8,否则系统级设置对它无效。











