终端中文乱码主因是lang未设对、zh_cn.utf-8 locale未生成或终端未启用utf-8编码,三者缺一不可;需依次验证locale -a输出、手动生成locale、设置lang/lc_all变量,并配置终端utf-8编码及中文字体。

终端显示中文乱码,90% 是 LANG 没设对、locale 没生成、或终端本身没启用 UTF-8 编码——三者缺一不可,光改一个基本白忙。
检查 locale 是否已生成 zh_CN.UTF-8
别急着改配置,先确认系统有没有这个 locale。运行:
locale -a | grep -i 'zh_cn\.utf-8\|zh_CN\.utf8'
如果没输出,说明它根本不存在,后续所有 export LANG=zh_CN.UTF-8 都是空转。这时得手动生成:
- Debian/Ubuntu:确保装了
locales包:sudo apt install locales,再编辑/etc/locale.gen,取消注释zh_CN.UTF-8 UTF-8,然后sudo locale-gen - CentOS/RHEL:运行
sudo localedef -c -i zh_CN -f UTF-8 zh_CN.UTF-8(-c参数不能省,否则失败无声) - 验证是否成功:
locale -a | grep zh_CN.utf8应返回zh_CN.utf8(注意小写和点号)
设置 LANG 和 LC_ALL 环境变量
生成完 locale 后,环境变量才是生效开关。但要注意作用域和优先级:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 临时测试用:
export LANG=zh_CN.UTF-8和export LC_ALL=zh_CN.UTF-8(LC_ALL会覆盖所有其他LC_*,适合调试) - 用户级永久生效:加到
~/.bashrc或~/.zshrc末尾,再source;不要设在/etc/environment里,它不解析export语法 - 系统级慎用:
/etc/default/locale只影响由 systemd 启动的服务,不影响交互式 shell;改/etc/locale.conf(RHEL/CentOS)或/etc/default/locale(Debian/Ubuntu)后需重新登录,不是 reload
终端模拟器必须显式启用 UTF-8 编码
即使 locale 和环境变量全对,终端自己不认 UTF-8 还是显示方块或问号:
- GNOME Terminal:编辑 → 首选项 → 当前配置文件 → 字体 → 勾选“使用自定义字体”,选
Noto Sans CJK SC或WenQuanYi Micro Hei;再进“文本”选项卡 → 字符编码 → 选Unicode (UTF-8) - Xshell:文件 → 属性 → 终端 → 编码 → 选
UTF-8;同时在“字体”页确认所选字体支持中文(比如DejaVu Sans Mono要额外装 CJK 补丁) - SecureCRT:
Options → Session Options → Appearance → Font encoding设为UTF-8,再进Translation → Remote character set设为UTF-8(不是 “Use font encoding”) - Windows Terminal(连 WSL):在
settings.json的 profile 里加"locale": "zh_CN.UTF-8",并确保"fontFace"指向含 CJK 字形的字体(如Cascadia Code PL)
SSH 连接时乱码?客户端和服务端要双向握手
本地终端配好了,连远程服务器还是乱码,大概率是 SSH 把本地的 LANG 带过去了,而服务端没接住:
- 客户端(如 OpenSSH)需在
~/.ssh/config中对应 Host 下加:SendEnv LANG LC_* - 服务端需在
/etc/ssh/sshd_config中有:AcceptEnv LANG LC_*,然后sudo systemctl restart sshd - Windows 自带 OpenSSH 连 Linux 时,PowerShell/CMD 默认代码页是 936(GBK),得先运行:
chcp 65001再 ssh,否则传输层就解错了 - FinalShell/Xshell 等 GUI 客户端,直接在连接设置里把“字符编码”选成
UTF-8即可,不用动 SendEnv
真正卡住人的地方,从来不是“哪一步不会做”,而是改完 LANG 忘了查 locale -a,生成了 locale 忘了重启终端,或者终端设了 UTF-8 却用了不支持中文的字体——三个环节环环相扣,漏一个,中文就还在方块里蹲着。










