我需要一个我想确保使用 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文件。
答案 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