为什么VIM会忽略我的文件BOM?

时间:2011-08-26 11:47:10

标签: vim utf-8 byte-order-mark

我需要一个我想确保使用 utf8 进行编码的文件。

所以,我创建了文件

c:\> gvim umlaute.txt

在VIM中我输入了变音符号:

äöü

我检查编码......

:set enc

(VIM回应encoding=latin1

然后我检查文件编码......

:set fenc

(VIM回应fileencoding=

然后我写了文件

:w

并检查硬盘上文件的大小:

!dir umlaute.txt

(大小为5个字节)当然可以预期,文本为3个字节,\ x0a \ x0d为2个字节。

好的,我现在将编码设置为

:set enc=utf8

缓冲区变得很奇怪

<e4><f6><fc>

我想这是我之前输入的ascii字符的十六进制表示。所以我重写他们

äöü

写作,检查大小:

:w
:$ dir umlaute.txt

这次是8个字节。我想这对于每个字符加2x字节加上\ x0d \ x0a。

好的,所以我想确保下次打开文件时会用encodiung = utf8打开。

:setb
:w

:$ dir umlaute.txt

11个字节。这当然是8(先前)BOM的字节+ 3字节(ef bb bf)。

所以我

:quit

vim并再次打开文件

并检查是否设置了编码:

:set enc

但是VIM坚持encoding=latin1

那么,为什么呢。我原以为BOM会告诉VIM这是一个UTF8文件。

3 个答案:

答案 0 :(得分:16)

令人困惑的是'encoding'这是一个Vim全局设置,而'fileencoding'则是每个缓冲区的本地设置。

打开文件时,变量'fileencodings'(注意最终的 s )确定Vim将尝试打开文件的编码。如果它以ucs-bom开头,则如果正确解析,则任何带有BOM的文件都将正确打开。

如果要更改文件的编码,则应使用:set fenc=<foo>。如果要删除BOM,则应使用:set [no]bomb。然后使用:w保存。

在打开缓冲区后避免更改enc,这可能会搞砸事情。 enc确定vim可以使用的字符,它与您正在使用的文件无关。

详细

  

c:\> gvim umlaute.txt

您正在打开vim,文件名不存在。 Vim创建一个缓冲区,为其指定名称,并将fenc设置为空值,因为没有与之关联的文件。

  

:set enc

     

(VIM回应编码= latin1)

这意味着Vim将缓冲区内容存储在ISO-8859-1中(可能是另一个数字)。

  

然后我检查文件编码......

     

:set fenc

     

(VIM回应fileencoding =)

这是正常的,暂时没有档案。

  

然后我写了文件

     

:w

由于'fileencoding'为空,它会使用内部编码latin1将其写入磁盘。

  

并检查硬盘上文件的大小:

     

!dir umlaute.txt

     

(大小为5个字节)当然可以预期,文本为3个字节,\ x0a \ x0d为2个字节。

     

好的,我现在将编码设置为

     

:set enc=utf8

错误!您告诉vim它必须将缓冲区内容解释为UTF8内容。缓冲区包含十六进制的e4 f6 fc 0a 0d,前三个字节是无效的UTF8字符序列。您应该键入:set fenc=utf-8。这会转换缓冲区。

  

缓冲区变得很奇怪

     

当你强迫Vim将非法的UTF-8文件解释为UTF8时会发生这种情况。

  

我猜这是我之前输入的ascii字符的十六进制表示。所以我重写了它们

     

AOU

     

写作,检查大小:

     

:w   :$ dir umlaute.txt

     

这次是8个字节。我想这对于每个字符加2x字节加上\ x0d \ x0a。

     

好的,所以我想确保下次打开文件时会用encodiung = utf8打开。

     

:set bomb   :w

     

:$ dir umlaute.txt

     

11个字节。这当然是8(先前)BOM的字节+ 3字节(ef bb bf)。

     

所以我

     

:quit

     

vim并再次打开文件

     

并检查是否设置了编码:

     

:设置enc

     

但是VIM坚持其编码= latin1。

您应该运行set fenc?以了解检测到的文件编码是什么。如果你希望Vim能够使用Unicode文件,你应该在你的vimrc中设置'enc'是utf-8。

答案 1 :(得分:3)

经过多次尝试,我到达这里是一个有效的例子:

    setglobal bomb 
    set fileencodings=ucs-bom,utf-8,cp1251,koi8-r,cp866
    set nobin
    set fileencoding=utf-8 bomb

如果你想通过BOM来宣传新的领域:

    c:\gvim umlaute.txt

它现在正在运作!

答案 2 :(得分:0)

:help bomb显示以下信息:

  

编写文件并满足以下条件时,BOM(字节顺序标记)将添加到文件中:

     
      
  • 此选项已开启(编辑:即':set bomb')
  •   
  • '二进制'选项已关闭
  •   
  • 'fileencoding'是“utf-8”,“ucs-2”,“ucs-4”或其中一个小/大端变体。
  •   
     

某些应用程序使用BOM识别文件的编码。   通常用于MS-Windows上的UCS-2文件。对于其他应用程序   导致麻烦,例如:“cat file1 file2”生成file2的BOM   出现在生成的文件的中间。 Gcc不接受BOM。   当Vim读取文件并且'fileencodings'以“ucs-bom”开头时,a   检查是否存在BOM并且相应地设置'炸弹'。   除非设置了“二进制”,否则它将从第一行中删除,以便您   编辑时看不到它。当您不更改选项时,BOM   将在写入文件时恢复。

请尝试在.vimrc中设置:

set fileencodings=ucs-bom,utf-8,latin1
set nobin
setglobal fileencoding=utf-8