002-ls乱码问题
终端中文显示为 ??? 的问题排查与修复笔记
1. 问题现象
-
终端中 ls 时,中文文件名显示为 ???
-
文件本身存在且正常,但终端无法正确显示非 ASCII 字符
2. 成因分析
-
终端的字符编码环境(locale)不支持 UTF-8
-
LC_CTYPE 或 LANG 等 locale 变量设置为 C、POSIX 或其他非 UTF-8 编码
-
UTF-8 是支持中文和多语言字符的通用编码,非 UTF-8 环境会导致中文显示异常
示例有问题的 locale:
LANG="en_CN.UTF-8"
LC_CTYPE="C"
其中 LC_CTYPE="C" 就会导致中文变成 ???
3. 排查步骤
- 查看当前 locale 设置
locale
重点看:
-
LANG
-
LC_CTYPE
-
LC_ALL
- 确认是否为 UTF-8
-
如果是 C / POSIX / ASCII 等,表示不支持中文
-
如果是 UTF-8 结尾,如 en_US.UTF-8,则支持中文
4. 修复方法(zsh 环境为例)
- 编辑 ~/.zshrc
nano ~/.zshrc
- 添加以下内容(全局使用 UTF-8)
export LANG="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"
- 让配置生效
source ~/.zshrc
- 验证
locale
输出应为:
LANG="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
...
LC_ALL="en_US.UTF-8"
- 再次 ls,中文文件名应正常显示
5. 额外建议
-
macOS 终端建议在 Terminal.app / iTerm2 设置中也选择 UTF-8 编码
-
如果是在服务器上,可以将 locale 设置写入 /etc/profile 或 ~/.bashrc,确保所有登录会话生效
✅ 一句话总结
中文显示为 ???,90% 是 LC_CTYPE 或 LANG 没设为 UTF-8,改成 UTF-8 并重新加载配置即可。