vim 中插入utf-8的bom头

VIM和BOM

最近发现个怪现象, 从Vim中复制的文本(xsel的方式)和实际文本有点点区别, 会在头部加几个不可见的字节(0xEF 0xBB 0xBF), 粘贴到别的程序里有时会引发错误.

查了下, 原来这几个字节是Unicode的BOM(Byte order mark),  用来标记UTF-16和UTF-32编码文件的字节序, UTF-8并不需要. 但因为这个文件我曾经用Windows的记事本保存过,  它自作聪明地加了个BOM,  而Vim识别到文件有BOM就会自动打开bomb这个选项(具体解释请看Vim中bomb和fileencodings的帮助), so…

于是, 这样, 然后保存就好了:

小提示, 查看当前bomb是否打开可以这样:

——————————–

创建一个文件,输入一行中文,执行
:set fileencoding=utf-8
设置文件编码,并执行
:w
保存,然后执行
:e
重新加载,接着插入BOM头
:1s/^/\="\xef\xbb\xbf"
最后保存并退出:
😡
成功了!
xialulee@xialulee-pc3 ~/lab
$ xxd bom1.txt
0000000: efbb bfe6 b58b e8af 95e4 b880 e4b8 8b42

……………B
0000010: 4f4d 0d0a OM..
前三个字节正是ef bb bf。
他:现在好了,可以用你以前交给我的方法将大量的cue文件批量转换了。
我:什么方法?
他:就是那个-c参数啊!以非交互的方式运行Vim,如:
xialulee@xialulee-pc3 ~/lab
$ vim -c ‘set encoding=shift_jis | set fileencoding=utf-8 | w | e | 1s/^/\="\xef\xbb\xbf"/ | x’ CDImage.ape.cue
可以以非交互的方式使用,配合bash或者cmd的for循环,就可以搞定一堆cue文件了。
我:那是。要说现在cmd的for循环也蛮强大的。而且还有PowerShell可以用。在没有msys或者GnuWin32的情况下,将cmd或PowerShell与非交互的Vim结合起来进行批量处理,应该可行的。

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据