Answers:
您可以尝试:
%s/<CTRL-2>//g
(在普通PC上)
%s/<CTRL-SHIFT-2>//g
(在Mac PC上)
此处的<CTRL-2>
意思是先按下CTRL常规PC上的,并保持按下,击打2和释放的状态CTRL。
并<CTRL-SHIFT-2>
意味着先按下controlMac PC上的,保持按下状态,再按下shiftMac PC上的,保持按下状态,按下2,释放control和shift。
最后,这两个命令都应显示在%s/^@//g
屏幕上。^@
表示一个字符(一个NULL字节,否则将无法显示),而不是^
后跟@
,因此您不能仅在上述命令中键入^
和@
一行。
此命令将删除所有^@
。
我不认为您的文件已损坏。您的示例行看起来像包含常规文本,每个字符之间都有空字节。这表明它是一个以UTF-16编码的文本文件,但文件的开头缺少字节顺序标记。参见http://en.wikipedia.org/wiki/Byte-order_mark
假设我打开记事本,键入单词“文件名”,然后另存为Unicode Big-endian。此文件的十六进制转储如下所示:
fe ff 00 66 00 69 00 6c 00 65 00 6e 00 61 00 6d 00 65
如果我在Vim中打开此文件,看起来不错-“ fe ff”字节告诉Vim文件的编码方式。现在假设我创建了一个文件,该文件包含完全相同的字节序列,但没有前导“ fe ff”。Vim插入^ @(或<00>,取决于您的配置)来代替空字节。记事本插入空格。
因此,与其删除空值,不如真正让Vim正确解释文件。您可以使用以下命令使Vim以正确的编码重新加载文件:
:e ++enc=utf16
这实际上在vim中对我有用:
:%s/\%x00//g
<Ctrl-V><Ctrl-2>
(以及使用的人<Ctrl-Shift-2>
)工作,但这确实可行。
FWIW,就我而言,我必须在cygwin上使用vim编辑在Mac上创建的文本文件。可接受的解决方案对我不起作用,但是很接近。根据Vim Wiki页面上有关使用Unicode的信息,BOM字节的Big Endian版本和Little Endian版本之间存在差异。因此,我必须明确告知vim
要使用Little Endian版本的BOM编码。
仅在选择了正确的编码后,我才将文件格式(行尾)转换为,dos
以便可以在Windows编辑器中编辑文件。在指定编码之前尝试设置重设文件格式让我很伤心。这是我使用的命令的完整列表:
:e ++enc=utf16le
:w!
:e ++ff=mac
:setlocal ff=dos
:wq
除了@jrb的答案外,在Vim中,还将根据fileencodings选项检测文件的字符编码。(请注意文件编码末尾的“ s”)
即在Windows上,该fileencodings
选项的默认值为ucs-bom
,表示:
检查BOM表是否存在于文件的开头。
如果存在BOM,则“从BOM中读取文件的字符编码”。
如果BOM不存在(在这种情况下,这也意味着该fileencodings
选项中指定的所有字符编码均不匹配),请使用该encoding
选项中指定的字符编码读取文件。该encoding
选项的默认字符编码为:latin1
。现在,由于latin1
是一字节长的字符编码,因此文件中的所有字节都是有效latin1
字符(甚至是您看到的Nul
字符^@
*)。
*-实际上^@
是Vim缓冲区文本中的换行符,而不是Nul字符。
读取文件的正确方法是手动将字符编码指定为UTF-16(因为在这种情况下,看起来UTF-16是正确的char编码)。