Ubuntu终端中文乱码需同时满足三条件:生成zh_CN.UTF-8 locale(编辑/etc/locale.gen并sudo locale-gen)、正确设置LANG/LC_ALL环境变量(写入~/.bashrc或/etc/default/locale)、终端模拟器启用UTF-8编码并指定中文字体。

Ubuntu终端显示中文乱码,不是改个LANG就能好——它卡在三个地方:系统没生成zh_CN.UTF-8 locale、环境变量没生效、终端模拟器自己没开 UTF-8 编码。三者缺一不可。
检查系统是否已生成 zh_CN.UTF-8 locale
别急着改配置,先看系统有没有这个编码支持。运行:
locale -a | grep -i 'zh_cn\.utf-8\|zh_CN\.utf8'
如果没输出,说明zh_CN.UTF-8根本没生成,后面所有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 - RHEL/CentOS 系统:用
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 后,环境变量才是开关。但作用域和优先级容易搞错:
Ubuntu 26.04 LTS(代号“Resolute Raccoon”)是Canonical于2026年4月23日发布的下一代长期支持版操作系统,提供长达10年的技术支持。它搭载Linux 7.0内核与GNOME 50桌面环境,全面转向Wayland协议,并引入Rust重写的核心工具以增强安全性。官方提供适用于AMD64和ARM64架构的桌面及服务器ISO镜像,是追求前沿技术与极致稳定的开发者
- 临时测试:直接运行
export LANG=zh_CN.UTF-8和export LC_ALL=zh_CN.UTF-8,立刻生效,适合调试 - 用户级永久生效:加到
~/.bashrc或~/.zshrc末尾,然后source ~/.bashrc;不要写进/etc/environment,它不解析export语法 - 系统级慎用:
/etc/default/locale(Debian/Ubuntu)或/etc/locale.conf(RHEL/CentOS)只影响 systemd 启动的服务,不影响交互式 shell;改完需重新登录,不是 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 补丁) - Windows Terminal(连 WSL):在
settings.json的 profile 里加"locale": "zh_CN.UTF-8",并确保"fontFace"指向含 CJK 字形的字体(如Cascadia Code PL) - SecureCRT:
Options → Session Options → Appearance → Font encoding设为UTF-8,再进Translation → Remote character set设为UTF-8(不是 “Use font encoding”)
不推荐强行用 GBK/GB2312 字符集
Ubuntu 官方已弃用非 UTF-8 中文 locale,强行配 zh_CN.GBK 会引发一堆兼容性问题:
-
apt、systemd、journalctl等核心工具默认只适配 UTF-8,遇到 GBK 可能报错或截断日志 -
locale-gen不再默认支持 GBK,需手动往/var/lib/locales/supported.d/local添加条目,且多数现代终端根本不识别 GBK 编码选项 - SSH 连远程服务器时,客户端和服务端字符集不一致会导致管道命令(如
grep、sed)误判字节边界,结果不可靠
真正需要 GBK 场景(如读取老旧日志),用 iconv -f GBK -t UTF-8 file.log 转码更安全,而不是把整个终端设成 GBK。

















