win下面的cmder中的vim . 中文乱码. 试了各种解决方式.. 还是没弄好
乱码的本质只有一个:编码链路某一段对不上。vim 在终端里显示中文要过三关:文件本身的编码、vim 内部编码(encoding)、终端代码页(termencoding)。在 cmder 里出问题,大概率是后两关没对上——很多人只改了 vimrc 里的一项,链路另一头还是错的,所以"试了各种方式都不行"。
在 vim 里执行:
:set encoding? fileencoding? fileencodings? termencoding?
encoding:vim 内部使用的编码,建议固定 utf-8
encoding
utf-8
fileencoding:当前文件的实际编码,vim 打开文件时按 fileencodings 列表猜
fileencoding
fileencodings
termencoding:vim 和终端之间传输用的编码——cmder 里乱码的高发区
termencoding
再看终端代码页,cmder 里执行 chcp:
chcp
输出 936 → 终端是 GBK
936
输出 65001 → 终端是 UTF-8
65001
情况A:终端是 GBK(chcp 936),文件是 UTF-8
set encoding=utf-8 set fileencodings=utf-8,gbk,gb18030,ucs-bom,latin1 set termencoding=gbk
vim 会把内部的 UTF-8 转成 GBK 再交给终端显示,缺了 termencoding 这一步就是你看到的乱码。
情况B:已经把终端切成 UTF-8(chcp 65001)
set encoding=utf-8 set fileencodings=utf-8,gbk,gb18030,ucs-bom,latin1 set termencoding=utf-8
注意:改完 chcp 如果还乱码,关掉当前 cmder 标签页重开再试,代码页和环境不是实时刷新的。
情况C:文件本身就是 GBK
打开时手动指定:
:e ++enc=gbk
想永久转成 UTF-8:
:set fenc=utf-8 :w
或者批量转:
iconv -f GBK -t UTF-8 old.txt > new.txt
如果 vimrc 里有中文注释,而文件保存成了 UTF-8,vim 启动时按 ANSI 读它,注释行会乱码甚至直接报错。把 _vimrc 另存为"UTF-8 无 BOM",或者干脆去掉中文注释。这个坑不少人踩过——症状是"vim 一启动就报乱码",跟打开什么文件无关。
分不清一串乱码到底是"UTF-8 被当成 GBK 读了"还是反过来时,直接看原始字节最靠谱:
vim 里 :%!xxd 看十六进制:UTF-8 的中文一般占 3 字节且首字节 ≥ 0xE0;GBK 是 2 字节、两个字节都 ≥ 0x81。看一眼字节形态就能判断文件真实编码
:%!xxd
或者把乱码文本粘到在线编码转换工具里,切换 GBK/UTF-8 互转,哪个方向能还原出正常中文,立刻定位是哪种错位
我做这种验证时用的是工具派上的编码转换工具(GBK/UTF-8/URL/Base64 这些互转都有,站在这:https://gjupai.com/ ),粘进去切换一下就能看到原文,比本地临时装工具省事。
cmder + vim 乱码按这个顺序查:chcp 确认终端代码页 → termencoding 跟终端对齐 → fileencodings 覆盖文件实际编码 → _vimrc 自身编码检查。四步都对上之后基本不会再乱。如果你按上面查完某一步对不上,可以把 :set enc? fenc? fencs? tenc? 和 chcp 的输出发出来,我帮你看卡在哪一环。
:set enc? fenc? fencs? tenc?
回答:win下面的cmder中的vim . 中文乱码. 试了各种解决方式.. 还是没弄好
乱码的本质只有一个:编码链路某一段对不上。vim 在终端里显示中文要过三关:文件本身的编码、vim 内部编码(encoding)、终端代码页(termencoding)。在 cmder 里出问题,大概率是后两关没对上——很多人只改了 vimrc 里的一项,链路另一头还是错的,所以"试了各种方式都不行"。
1. 先确认乱码发生在哪一环
在 vim 里执行:
:set encoding? fileencoding? fileencodings? termencoding?encoding:vim 内部使用的编码,建议固定utf-8fileencoding:当前文件的实际编码,vim 打开文件时按fileencodings列表猜termencoding:vim 和终端之间传输用的编码——cmder 里乱码的高发区再看终端代码页,cmder 里执行
chcp:输出
936→ 终端是 GBK输出
65001→ 终端是 UTF-82. 对症设置
情况A:终端是 GBK(chcp 936),文件是 UTF-8
vim 会把内部的 UTF-8 转成 GBK 再交给终端显示,缺了
termencoding这一步就是你看到的乱码。情况B:已经把终端切成 UTF-8(chcp 65001)
注意:改完 chcp 如果还乱码,关掉当前 cmder 标签页重开再试,代码页和环境不是实时刷新的。
情况C:文件本身就是 GBK
打开时手动指定:
:e ++enc=gbk想永久转成 UTF-8:
或者批量转:
iconv -f GBK -t UTF-8 old.txt > new.txt3. 别忽略 _vimrc 文件本身
如果 vimrc 里有中文注释,而文件保存成了 UTF-8,vim 启动时按 ANSI 读它,注释行会乱码甚至直接报错。把 _vimrc 另存为"UTF-8 无 BOM",或者干脆去掉中文注释。这个坑不少人踩过——症状是"vim 一启动就报乱码",跟打开什么文件无关。
4. 一个实用的排查技巧
分不清一串乱码到底是"UTF-8 被当成 GBK 读了"还是反过来时,直接看原始字节最靠谱:
vim 里
:%!xxd看十六进制:UTF-8 的中文一般占 3 字节且首字节 ≥ 0xE0;GBK 是 2 字节、两个字节都 ≥ 0x81。看一眼字节形态就能判断文件真实编码或者把乱码文本粘到在线编码转换工具里,切换 GBK/UTF-8 互转,哪个方向能还原出正常中文,立刻定位是哪种错位
我做这种验证时用的是工具派上的编码转换工具(GBK/UTF-8/URL/Base64 这些互转都有,站在这:https://gjupai.com/ ),粘进去切换一下就能看到原文,比本地临时装工具省事。
总结
cmder + vim 乱码按这个顺序查:chcp 确认终端代码页 →
termencoding跟终端对齐 →fileencodings覆盖文件实际编码 → _vimrc 自身编码检查。四步都对上之后基本不会再乱。如果你按上面查完某一步对不上,可以把:set enc? fenc? fencs? tenc?和chcp的输出发出来,我帮你看卡在哪一环。