Ubuntu WSL切换至fish shell后终端应用字符编码异常问题
我之前在WSL Ubuntu里折腾fish shell时也踩过这个一模一样的坑!当时也是fish自身显示中文啥的都正常,一打开vim就乱码,折腾了半天才搞明白是环境变量的锅,给你分享下解决思路和实操方法:
首先先确认下问题的核心:你碰到的情况是——
- 在bash和fish终端里直接输入非ASCII字符(比如中文、特殊符号)都能正常显示
- 从bash启动vim,输入和显示非ASCII字符完全正常;但从fish启动vim后,非ASCII字符就会显示成乱码
从你贴的bash环境下的locale输出来看,bash的编码设置是完全正确的:
jan@HSD-PF540YBG:~$ locale LANG=C.UTF-8 LANGUAGE= LC_CTYPE="C.UTF-8" LC_NUMERIC="C.UTF-8" LC_TIME="C.UTF-8" LC_COLLATE="C.UTF-8" LC_MONETARY="C.UTF-8" LC_MESSAGES="C.UTF-8" LC_PAPER="C.UTF-8" LC_NAME="C.UTF-8" LC_ADDRESS="C.UTF-8" LC_TELEPHONE="C.UTF-8" LC_MEASUREMENT="C.UTF-8" LC_IDENTIFICATION="C.UTF-8" LC_ALL=
问题出在fish shell没有正确继承或设置编码相关的环境变量!fish自身对编码的处理比较“聪明”,但它启动子进程(比如vim)时,不会自动把所有必要的locale变量传过去,导致vim用了错误的编码解析字符,最终乱码。
给你一套亲测有效的解决步骤:
先检查fish里的locale设置
在fish终端里运行locale命令,看看输出里的LANG和所有LC_*变量是不是都设置成了C.UTF-8。如果有变量是空的或者是其他非UTF-8的取值,那就是问题根源了。强制给fish设置正确的编码环境变量
编辑fish的全局配置文件~/.config/fish/config.fish,在文件末尾添加以下两行:set -x LANG C.UTF-8 set -x LC_ALL C.UTF-8保存文件后,输入
exec fish重启fish shell,或者用source ~/.config/fish/config.fish重新加载配置。验证修复效果
现在再打开vim,输入非ASCII字符试试,应该就能正常显示了;同时再运行locale确认所有变量都正确设置为C.UTF-8。额外小提醒
还要确保你用的Windows终端(比如Windows Terminal、CMD)本身的默认编码是UTF-8,避免WSL和Windows终端之间的编码不匹配导致的二次乱码。
备注:内容来源于stack exchange,提问作者janeden

