6

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

所以,我创建了文件

c:\> gvim umlaute.txt

在 VIM 中,我输入元音变音符号:

äöü

我检查编码...

:set enc

(VIM 回声encoding=latin1

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

:set fenc

(VIM 回声fileencoding=

然后我写文件

:w

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

!dir umlaute.txt

(大小为 5 个字节)这当然是预期的,3 个字节用于文本,2 个字节用于 \x0a \x0d。

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

:set enc=utf8

缓冲区变得很奇怪

<e4><f6><fc>

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

äöü

书写、检查尺寸:

:w
:$ dir umlaute.txt

这次是 8 个字节。我想每个字符加上 \x0d \x0a 2 个字节是有意义的。

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

:setb
:w

:$ dir umlaute.txt

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

所以我

:quit

vim 并再次打开文件

并检查是否设置了编码:

:set enc

但 VIM 坚持其encoding=latin1.

那么,为什么会这样。我本来希望 BOM 告诉 VIM 这是一个 UTF8 文件。

4

3 回答 3

18

你会混淆'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 个字节用于文本,2 个字节用于 \x0a \x0d。

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

:set enc=utf8

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

缓冲区变得很奇怪

当您强制 Vim 将非法 UTF-8 文件解释为 UTF8 时,就会发生这种情况。

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

邯郸

书写、检查尺寸:

:w :$ dir umlaute.txt

这次是 8 个字节。我想每个字符加上 \x0d \x0a 2 个字节是有意义的。

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

:set bomb :w

:$ dir umlaute.txt

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

所以我

:quit

vim 并再次打开文件

并检查是否设置了编码:

: 设置编码

但是 VIM 坚持它的 encoding=latin1。

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

于 2011-08-26T12:08:53.510 回答
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

它现在正在工作!

于 2011-12-22T06:31:52.320 回答
1

:help bomb揭示以下信息:

写入文件并满足以下条件时,会在文件前添加 BOM(字节顺序标记):

  • 此选项已打开(编辑:即':设置炸弹')
  • “二进制”选项已关闭
  • 'fileencoding' 是 "utf-8"、"ucs-2"、"ucs-4" 或小/大端变体之一。

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

所以尝试在你的 .vimrc 中设置它:

set fileencodings=ucs-bom,utf-8,latin1
set nobin
setglobal fileencoding=utf-8
于 2011-08-26T12:05:54.833 回答