如何在vim中找到当前缓冲区的编码?


89

说我正在用vim(或gvim)编辑一些文件。我不知道文件的编码,我想知道它是UTF-8还是ISO-8859-1或其他格式?我能以某种方式告诉vim告诉我使用什么编码吗?

Answers:


104

fileencoding设置显示当前缓冲区的编码:

:set fileencoding
fileencoding=utf8

实际上,没有一种确定明文文件编码的通用方法,因为该信息并不保存在文件本身中-除了UTF-8文件外,在该文件中有一个所谓的BOM指示编码。这就是xml和html文件具有字符集元标记的原因。

您可以使用'encoding'设置实施特定的编码。有关编辑器如何处理这些设置的信息:help encoding,请参见and :help fileencoding在Vim中。您也可以在vimrc中添加几个文件编码设置,以使vim尝试根据列出的设置进行检测。


1
完善。即使有些反直觉。谢谢!
innaM 2009年

7
不幸的是,这是不正确的。对于Vim,找不到正在读取的文件的编码。它没有写在文件中。它只能根据文件中的可用字符进行猜测。例如,带有文本“ abcdef”的文件可以采用多种编码,因为实际上所有文件都支持这些字符,但是带有“šđčćž”的文件很可能位于CP1252中。因此,您不是从某个地方读取编码,而是猜测编码可能是什么,并基于正确显示的编码。
Rook

6
您在这里所做的是基于对文件内容的观察来显式设置编码。如果希望vim尝试多种编码,请在打开文件时将其中几种放入_vimrc的选项中。
Rook 2009年

@ldigas,感谢您的反馈,我已经将答案更新得更加清晰了(我希望!)
jtimberman 2009年

2
可能值得一提的是,BOM是1.)不是UTF-8独有的 -尽管UTF-8与其他BOM有所不同,但是2.)不是必需的,通常在UTF-8中找不到
鲁芬2014年

13

请注意,文件的编码在文件的任何位置明确声明。因此,VIM和其他应用程序必须猜测编码。规范的实现方式是使用chardet应用程序,它可以在VIM内部运行,如下所示:

:!chardet %

jtimberman提供的答案将向您显示当前缓冲区的编码,该编码可能与磁盘上的文件的编码不同。因此,您会注意到chardet有时会显示与VIM不同的编码,特别是如果您已将VIM配置为始终使用特定的编码(即UTF-8)。

令人高兴的chardet是,它为猜测提供了可信度得分,而如果\ x7F(ASCII 127)以上没有太多字符,则VIM在猜测编码方面可能(通常是错误的)。例如,将单个א文件添加到一个较长的PHP代码文件中会使chardet文件ISO-8859-2的置信度为0.72,而添加稍长的短语שלום, עולם!‏将给UTF-8提供0.99的置信度。在这两种情况下,set fileencoding?显示的UTF-8都不是因为磁盘上的文件是UTF-8,而是因为VIM配置为在内部使用UTF-8。


我建议您提及一下有关OS上chardet可用性的信息。
Soundararajan

@Soundararajan:因为我仅使用Debian和CentOS,所以我可能不是要提的人。不过,如果您有相关信息,也可以邀请您编辑答案。谢谢!
dotancohen

我认为不需要在VIM内执行此操作,最好从外部执行:chardet <file>。尽管如此,还是个好建议。
lepe

-1

我发现了:https : //vim.fandom.com/wiki/Reloading_a_file_using_a_different_encoding

如果Vim无法检测到正确的编码,则可以使用其他编码重新加载文件:

:e ++enc=<encoding>

encoding可能在哪里cp850, ISO-8859-1, UTF-8, ...

您可以使用dotancohen的建议file yourfilename来查找编码或chardetect(由Linux发行版提供python-chardetuchardet取决于Linux发行版)。


这没有回答如何找出当前编码的问题。取而代之的是,该命令将在缓冲区上强制进行其他一些编码。
Ruslan
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.