Vim 里出现的“不可见乱码字符”通常分三种情况:文件编码不对、存在 BOM、或者是控制字符/零宽字符混了进来。对应不同原因,处理方式也不一样。
在 Vim 里执行:
:set list
这样制表符、换行符、空格等都会显示出来。如果看到 ^M、^@、^[ 这类符号,说明是控制字符;如果是 这种,说明是 BOM;如果连 list 都看不出异常,但内容显示乱码,大概率是文件编码和 Vim 当前编码不一致。
^M
^@
^[
list
如果文件本身是 GBK/GB2312,但 Vim 按 UTF-8 打开,就会显示成乱码。可以用下面命令重新加载:
:e ++enc=gbk
确认内容正常后,再转存为 UTF-8:
:set fileencoding=utf-8 :w
如果不知道原文件是什么编码,可以在 shell 里用 file -i filename 看一下,或者用一些在线编码检测工具辅助判断。
file -i filename
有些 Windows 编辑器保存的 UTF-8 文件会带 BOM,Vim 里可能显示为文件开头一个看不见的字符,导致脚本执行失败。
查看当前是否有 BOM:
:set bomb?
删除 BOM:
:set nobomb :w
或者在命令行直接用 sed:
sed -i '1s/^\xEF\xBB\xBF//' filename
如果只是个别控制字符,比如 ^M(Windows 换行符),可以用替换:
:%s/\r//g
如果是不可见的零宽字符、特殊 Unicode 空白字符,可以用正则清理:
:%s/[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F]//g
这个范围覆盖了大部分非打印 ASCII 控制字符。如果你确定要保留换行和制表符,上面的范围已经排除了 \t(\x09)和 \n(\x0A)。
\t
\x09
\n
\x0A
对于零宽空格、零宽连接符这类 Unicode 字符,可以用:
:%s/\%u200B\|\%u200C\|\%u200D\|\%uFEFF//g
如果是一批文件都需要清理,不建议逐个进 Vim。可以用 Python 脚本批量处理:
import sys with open(sys.argv[1], 'rb') as f: data = f.read() # 移除 BOM data = data.lstrip(b'\xef\xbb\xbf') # 移除控制字符,保留换行、制表、回车 cleaned = bytes(b for b in data if b in (9, 10, 13) or b >= 32) with open(sys.argv[1], 'wb') as f: f.write(cleaned)
偶尔处理一两个文件,进 Vim 改没问题;但如果经常要批量清理、转编码、或者不确定文件编码,可以找一些在线文本处理工具辅助。比如我平时会把一些临时格式转换、编码检测、文本清理的需求丢到浏览器里处理,不用本地装一堆小工具。
相关工具地址:https://gjupai.com/
工具派上有个文本处理工具箱,支持编码转换、文本清理、正则替换这些常用操作,处理这种乱码问题比较省事。
Vim 里删除不可见乱码字符,核心思路是:
先看是编码问题还是控制字符问题;
编码问题用 :e ++enc=xxx 重新加载再转存;
:e ++enc=xxx
BOM 用 :set nobomb 或 sed 删除;
:set nobomb
控制字符用正则替换或脚本批量清理。
如果是临时处理,在线工具也是个不错的选择,省得每次写脚本。
如何删除vim中不可见乱码字符?
Vim 里出现的“不可见乱码字符”通常分三种情况:文件编码不对、存在 BOM、或者是控制字符/零宽字符混了进来。对应不同原因,处理方式也不一样。
一、先确认你看到的是哪种乱码
在 Vim 里执行:
:set list这样制表符、换行符、空格等都会显示出来。如果看到
^M、^@、^[这类符号,说明是控制字符;如果是 这种,说明是 BOM;如果连list都看不出异常,但内容显示乱码,大概率是文件编码和 Vim 当前编码不一致。二、编码不一致导致的乱码
如果文件本身是 GBK/GB2312,但 Vim 按 UTF-8 打开,就会显示成乱码。可以用下面命令重新加载:
:e ++enc=gbk确认内容正常后,再转存为 UTF-8:
如果不知道原文件是什么编码,可以在 shell 里用
file -i filename看一下,或者用一些在线编码检测工具辅助判断。三、删除 BOM
有些 Windows 编辑器保存的 UTF-8 文件会带 BOM,Vim 里可能显示为文件开头一个看不见的字符,导致脚本执行失败。
查看当前是否有 BOM:
:set bomb?删除 BOM:
或者在命令行直接用 sed:
sed -i '1s/^\xEF\xBB\xBF//' filename四、删除控制字符和零宽字符
如果只是个别控制字符,比如
^M(Windows 换行符),可以用替换::%s/\r//g如果是不可见的零宽字符、特殊 Unicode 空白字符,可以用正则清理:
:%s/[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F]//g这个范围覆盖了大部分非打印 ASCII 控制字符。如果你确定要保留换行和制表符,上面的范围已经排除了
\t(\x09)和\n(\x0A)。对于零宽空格、零宽连接符这类 Unicode 字符,可以用:
:%s/\%u200B\|\%u200C\|\%u200D\|\%uFEFF//g五、批量处理多个文件
如果是一批文件都需要清理,不建议逐个进 Vim。可以用 Python 脚本批量处理:
六、如果不想写脚本
偶尔处理一两个文件,进 Vim 改没问题;但如果经常要批量清理、转编码、或者不确定文件编码,可以找一些在线文本处理工具辅助。比如我平时会把一些临时格式转换、编码检测、文本清理的需求丢到浏览器里处理,不用本地装一堆小工具。
相关工具地址:https://gjupai.com/
工具派上有个文本处理工具箱,支持编码转换、文本清理、正则替换这些常用操作,处理这种乱码问题比较省事。
总结
Vim 里删除不可见乱码字符,核心思路是:
先看是编码问题还是控制字符问题;
编码问题用
:e ++enc=xxx重新加载再转存;BOM 用
:set nobomb或 sed 删除;控制字符用正则替换或脚本批量清理。
如果是临时处理,在线工具也是个不错的选择,省得每次写脚本。