+
 新版

如何删除vim中不可见乱码字符?

Codigger官方 发布于 2025/05/13 15:44
阅读 181
收藏 0

 

1、文件使用vim打开有乱码
2、如何识别出这些乱码,使用vim命令替换掉呢?
加载中
0
工具派
工具派

如何删除vim中不可见乱码字符?

Vim 里出现的“不可见乱码字符”通常分三种情况:文件编码不对、存在 BOM、或者是控制字符/零宽字符混了进来。对应不同原因,处理方式也不一样。

一、先确认你看到的是哪种乱码

在 Vim 里执行:

:set list

这样制表符、换行符、空格等都会显示出来。如果看到 ^M、^@、^[ 这类符号,说明是控制字符;如果是 这种,说明是 BOM;如果连 list 都看不出异常,但内容显示乱码,大概率是文件编码和 Vim 当前编码不一致。

二、编码不一致导致的乱码

如果文件本身是 GBK/GB2312,但 Vim 按 UTF-8 打开,就会显示成乱码。可以用下面命令重新加载:

:e ++enc=gbk

确认内容正常后,再转存为 UTF-8:

:set fileencoding=utf-8
:w

如果不知道原文件是什么编码,可以在 shell 里用 file -i filename 看一下,或者用一些在线编码检测工具辅助判断。

三、删除 BOM

有些 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)。

对于零宽空格、零宽连接符这类 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 里删除不可见乱码字符,核心思路是:

  1. 先看是编码问题还是控制字符问题;

  2. 编码问题用 :e ++enc=xxx 重新加载再转存;

  3. BOM 用 :set nobomb 或 sed 删除;

  4. 控制字符用正则替换或脚本批量清理。

如果是临时处理,在线工具也是个不错的选择,省得每次写脚本。

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部