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

终端中文显示乱码,不是改一个 LANG 就能解决的。核心是三者必须严格对齐:系统 locale、终端模拟器自身的字符编码设置、终端所用字体是否含中文字形。漏掉任意一环,都会出现 □、? 或空白。
检查系统是否真有 zh_CN.UTF-8 locale
只写 export LANG=zh_CN.UTF-8 没用——如果系统压根没生成这个 locale,locale 命令会 fallback 到 C 或 POSIX,输出全是英文,且中文文件名照样乱码。
- 运行
locale -a | grep zh_CN,确认输出里有zh_CN.utf8(注意是小写 + 点号,不是大写或下划线) - 如果没有,编辑
/etc/locale.gen,取消注释zh_CN.UTF-8 UTF-8这一行 - Debian/Ubuntu 执行
sudo locale-gen;CentOS/RHEL 执行sudo localedef -c -i zh_CN -f UTF-8 zh_CN.UTF-8(-c参数不能省,否则静默失败)
只在用户 shell 中设环境变量,别动全局配置
往 /etc/environment 或 /etc/profile 里硬塞 LANG,会导致 cron、systemd service、SSH 非交互式命令也继承中文 locale,可能让日志解析、脚本字符串比较出错。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 在
~/.bashrc或~/.zshrc末尾加两行:export LANG=zh_CN.UTF-8和export LC_ALL=zh_CN.UTF-8 - 执行
source ~/.bashrc(或对应 shell 配置),然后新开终端 - 验证:运行
locale,确认LANG、LC_CTYPE、LC_ALL全是zh_CN.UTF-8,且LC_ALL不为空
终端模拟器自身必须启用 UTF-8 编码
即使 locale 全对,GNOME Terminal、Windows Terminal、PuTTY 等若内部编码设成 ISO-8859-1 或“自动检测”,照样显示方块。这不是系统问题,是终端自己的设置。
- GNOME Terminal:菜单 → Preferences → Profile → Text → Character encoding → 选
Unicode (UTF-8) - Windows Terminal(连 WSL 或 SSH):在
settings.json的 profile 里加"locale": "zh_CN.UTF-8",并确保"fontFace"指向含 CJK 字形的字体(如Cascadia Code PL、Noto Sans CJK SC) - PuTTY / Xshell:进 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 / Konsole 设置里,务必勾选“使用自定义字体”,并选一个明确带中文的字体(如
Noto Sans CJK SC),别依赖默认的Monospace
最容易被忽略的是:SSH 远程连接时,客户端不会自动把本地 LANG 传给服务器,除非你显式配置 SendEnv LANG LC_* 和服务端 AcceptEnv。不配这一项,即使本地终端和服务器各自都对,连上去还是乱码。










