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

inn*_*naM 99 vim gvim character-encoding

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

jti*_*man 116

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

:set fileencoding
fileencoding=utf8
Run Code Online (Sandbox Code Playgroud)

确实没有一种通用的方法来确定纯文本文件的编码,因为该信息没有保存在文件本身中 - 除了 UTF-8 文件,在那里你有一个所谓的 BOM,它表示编码。这就是 xml 和 html 文件具有字符集元标记的原因。

您可以使用“编码”设置强制执行特定编码。有关编辑器如何处理这些设置的信息:help encoding,请参阅:help fileencodingVim 中的和。您还可以向 vimrc 添加多个文件编码设置,让 vim 尝试根据列出的设置进行检测。

  • 不幸的是,不正确。因为 Vim 无法*找到*您正在阅读的文件的编码。它没有写在文件中。它只能根据文件中的可用字符进行猜测。例如,带有文本“abcdef”的文件可以采用多种编码,因为实际上所有编码都支持这些字符,但带有“šđčćž”的文件可能采用 CP1252。因此,您不是从某处读取编码,而是猜测可能是什么编码,并基于此正确显示它。 (7认同)
  • 您在这里所做的是根据您对文件内容的观察明确*设置* 编码。如果你希望 vim 尝试多种编码,在打开文件时,将其中的几个放入 _vimrc 的选项中。 (6认同)
  • 可能值得一提的是,BOM 是 1.) [不是 UTF-8 独有的](http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding)——尽管 UTF-8 与其他 BOM 不同,2.) [不是必需的,通常在 UTF-8 中找不到](http://en.wikipedia.org/wiki/Byte_order_mark#cite_ref-3)。 (5认同)

dot*_*hen 17

请注意,文件的编码并未在文件中的任何地方明确说明。因此,VIM 和其他应用程序必须猜测编码。这样做的规范方法是使用chardet应用程序,它可以在 VIM 中运行,如下所示:

:!chardet %
Run Code Online (Sandbox Code Playgroud)

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内部。