如何将VIM的默认编码设置为UTF-8?


62

我想为一个提供翻译后字符串的开源项目做出贡献。他们的要求之一是,提供者必须使用UTF-8作为PO文件的编码。

我在Linux上使用VIM 7.3。如何确定VIM的编码设置为UTF-8,以便可以正确方式编辑和保存.po文件?

Answers:


64

当Vim读取现有文件时,它将尝试检测文件编码。写入文件时,Vim使用检测到的文件编码(除非您以不同的方式告诉它)。因此,将检测为UTF-8的文件写为UTF-8,将检测为Latin-1的文件写为Latin-1,依此类推。

默认情况下,检测过程是原始的。用Vim打开的每个文件都将假定为Latin-1,除非它在顶部检测到Unicode字节顺序标记。没有字节顺序标记的UTF-8文件将很难编辑,因为任何多字节字符将在缓冲区中显示为字符序列而不是单个字符。

更糟糕的是,Vim默认情况下使用Latin-1表示缓冲区中的文本。因此具有字节顺序标记的UTF-8文件将通过向下转换为Latin-1损坏。

解决方案是将Vim配置为在内部使用UTF-8。实际上,这是Vim文档中所建议的,并且不进行开箱即用的配置的唯一原因是,避免在希望Vim基本充当Latin-1编辑器的用户之间造成巨大的混乱。

在您的中.vimrc,添加set encoding=utf-8并重新启动Vim。

或者,设置LANG环境变量以指示UTF-8是您首选的字符编码。这不仅会影响Vim,还会影响依赖于LANG它确定文本表示方式的任何软件。例如,要指示文本应以en美国(US)中的英语()出现,并以UTF-8(utf-8)编码,请设置LANG=en_US.utf-8

现在,Vim将使用UTF-8表示缓冲区中的文本。另外,它还将更加确定地检测文件中的UTF-8编码。除了寻找字节顺序标记外,它还会在不返回拉丁1之前检查没有字节顺序标记的UTF-8。因此,它将不再损坏以UTF-8编码的文件,并且在编辑会话期间应正确显示UTF-8字符。

有关Vim如何检测文件编码的更多信息,请参见Vim文档中fileencodings选项

有关设置Vim的内部使用编码的更多信息,请参阅encoding 选项

如果你需要覆盖写入文件时回磁盘使用的编码,看到fileencoding 选项


3
实际上,看来我什至不必费心编辑.vimrc。实际上,编码的默认值为“ latin1”或$ LANG中的值,在我的系统上该值设置为en_US.UTF-8。因此:set encodingencoding=utf-8开箱即用。如预期的那样,如果LANG未设置,则:set encoding给出encoding=latin1。感谢您的出色回答!
保罗

这通常可能有用,所以我将其添加到了答案中。
MetaEd 2011年

如果您打开一个编码为latin1的文件,此设置是否会更改文件编码?如何使Vim保持文件编码完整,但对新文件更喜欢utf-8?
大卫·肯尼迪

只有当文件明确为Latin-1时,@ DaveKennedy Vim才能将其视为Latin-1。当编码不明确时,Vim必须选择。例如,仅包含7位ASCII码的文件是有效的Latin1,但它也是有效的UTF-8等。这样的文件通常将被视为UTF-8。避免此结果的一种方法是使文件编码明确。我见过的技巧是添加一个0xF7代码字符串。在UTF-8中,0xF7无效。但是在Latin-1中,它表示分隔符号(÷)。Vim通常会得出该文件为Latin-1的结论。
MetaEd

4

根据vimdoc的说法,vim会尝试自动检测文件编码,因此,如果您要编辑现有文件,则应该保持良好状态。

您可以随时使用强制编码:set fileencodings=utf-8。您可以在此处找到文档。


6
fileencodings = utf-8将使Vim将输入文件识别为UTF-8,然后执行有损转换为Latin-1。另外,它将导致Vim无法识别UTF-16。更好的解决方案是设置encoding = utf-8,这会将Vim从本机的一个字节编辑器变为本机的多字节编辑器。
MetaEd 2011年

@MetaEd你可以回答这个您的评论:)阐述
HHH
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.