WSL 中文字符编码问题

WSL 中文字符编码问题

在使用 Windows Subsystem for Linux (WSL) 做开发时,终端里偶尔会遇到中文显示乱码、文件名显示异常,或者 git loglsvim 中中文不正常的问题。这个问题大多数时候和 locale 配置终端字体 或者 文件编码 有关系。

这篇文章把我自己排查时常用的几个方法记一下,后面再遇到类似问题可以直接照着查。

1. 先确认是不是 locale 的问题

先在终端里执行:

1
locale

如果输出里看到的 LANGLC_ALL 之类不是 UTF-8,那大概率就是编码环境没配好。
例如下面这种就是正常的:

1
2
3
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"

如果显示成了 POSIXC,或者根本没有 UTF-8,就需要处理一下。

2. 临时解决:先把当前终端切到 UTF-8

有时候只是当前 shell 环境没带上编码设置,可以先手动执行:

1
2
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8

如果你更习惯英文环境,也可以这样:

1
2
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

执行完以后重新试一下中文输出,通常能马上看到效果。
但这种方式只对当前终端有效,关掉窗口以后就失效了。

3. 永久解决:生成并设置 UTF-8 locale

如果系统里压根没有生成对应的 locale,需要先安装并生成:

1
2
3
4
sudo apt-get update
sudo apt-get install locales
sudo locale-gen zh_CN.UTF-8
sudo update-locale LANG=zh_CN.UTF-8

如果你想使用英文环境,也可以执行:

1
2
sudo locale-gen en_US.UTF-8
sudo update-locale LANG=en_US.UTF-8

执行完成后,建议关闭当前 WSL 会话,重新进入一次:

1
wsl --shutdown

然后再打开 WSL,重新执行 locale 检查。

4. 写进 shell 配置文件

如果系统 locale 没问题,但某个 shell 启动时没有自动带上,也可以在用户配置里追加:

1
2
3
echo 'export LANG=zh_CN.UTF-8' >> ~/.bashrc
echo 'export LC_ALL=zh_CN.UTF-8' >> ~/.bashrc
source ~/.bashrc

如果你用的是 zsh,就改成:

1
2
3
echo 'export LANG=zh_CN.UTF-8' >> ~/.zshrc
echo 'export LC_ALL=zh_CN.UTF-8' >> ~/.zshrc
source ~/.zshrc

这种方式比较直接,适合个人开发环境。

5. 如果终端里还是显示方块或乱码

这时候就不一定是 WSL 本身的编码问题了,也可能是 Windows Terminal / 终端软件字体不支持中文

可以检查一下:

  1. 终端是不是使用了支持中文的字体
  2. Windows Terminal 配置里字符集显示是否正常
  3. 复制同一段中文到 Windows 本地终端里,看是不是也显示异常

如果字体不支持中文,就算 locale 配对了,终端里看起来也还是不正常。

6. 文件内容乱码时怎么处理

有些时候终端本身没问题,但打开某个文件还是乱码,这通常是文件编码本来就不是 UTF-8。
可以先查看文件编码:

1
file your_file.txt

如果确认不是 UTF-8,可以用 iconv 转一下:

1
iconv -f gbk -t utf-8 old.txt -o new.txt

常见场景是 Windows 下保存成了 GBK,拿到 WSL 里编辑时就会显示异常。

7. 顺手记录一个排查顺序

如果下次再碰到中文乱码,我一般按这个顺序查:

  1. 先看 locale
  2. 再看 locale -a 里有没有目标编码
  3. 试一把 export LANG=...
  4. 终端字体不对就换字体
  5. 如果只有某个文件乱码,再检查文件本身编码

这样基本都能定位出来。

题外

关于 WSL 显示 GUI App

如果除了中文显示之外,还想在 WSL 里直接跑 GUI 程序,可以顺手确认一下 WSL 图形支持是否已开启:

  1. 选择“开始”,输入 PowerShell,右键以管理员身份运行。
  2. 执行更新命令:
1
wsl --update
  1. 更新完成后重启 WSL:
1
wsl --shutdown
  1. 再次进入 WSL 后,就可以测试一些 GUI 程序了。

总结

WSL 中文乱码问题看起来像是一个问题,实际常见原因一般就三类:locale 没配好、终端字体不支持、文件本身不是 UTF-8
只要按顺序去查,通常很快就能定位。对我自己来说,最常用也最有效的还是先检查 locale,很多时候问题就出在这里。