在 OEL 8 环境中,中文文件本身可能没有问题,终端显示也可能完全正常,但一进入 Vim 就变成乱码。这个现象很容易让人误判为文件编码损坏。笔者环境中的根因并不在文件,而在用户 Locale。
01 | 现象:cat 正常,vi 乱码
问题表现很典型:
在 SecureCRT 终端中,直接粘贴中文是正常的;通过 cat 查看文件,中文也能正常显示。
但使用 vi 编辑同一个文件时,中文显示为乱码。更容易迷惑的是,保存退出后再用 cat 查看,中文又恢复正常。
这说明文件实际内容大概率没有被破坏,终端本身也具备显示中文的能力。问题集中在 Vim 打开文件时对字符编码的解析和显示。
02 | 根因:用户 Locale 还是 POSIX
笔者环境中,codex 用户的 Locale 为 POSIX。
POSIX 不支持 UTF-8 多字节字符,因此 Vim 在该用户环境下打开中文文件时,会以不合适的编码方式解析内容,最终导致中文显示乱码。
也就是说,文件内容编码是正确的,只是 Vim 运行时所在的用户环境没有告诉它应该按 UTF-8 来处理字符。
03 | 修复:为 codex 用户设置 UTF-8 Locale
先确认系统中存在 UTF-8 Locale:
bash
locale -a | grep -Ei 'utf|utf8'
然后在 codex 用户环境中设置:
bash
export LANG=C.utf8
临时生效后,可以用下面命令验证当前字符集:
bash
locale charmap
期望输出为:
text
UTF-8
如果需要持久化配置,将下面一行写入 /home/codex/.bash_profile:
bash
export LANG=C.utf8
然后重新执行 su - codex 登录,让配置重新加载。
04 | 结论:只需要设置 LANG
这个问题不需要复杂处理,也不需要额外设置 LC_CTYPE。
在笔者环境中,仅设置:
bash
export LANG=C.utf8
即可让 Vim 正常显示和编辑 UTF-8 中文。排查这类问题时,可以先区分"文件是否真的坏了"和"当前用户环境是否支持 UTF-8",这样能少走很多弯路。
关注我,和AI一起成长~