【问题标题】:How can I change a file's encoding with vim?如何使用 vim 更改文件的编码?
【发布时间】:2025-12-19 23:55:06
【问题描述】:

我习惯用vim修改文件的行尾:

$ file file
file: ASCII text, with CRLF line terminators
$ vim file
:set ff=mac
:wq
$ file file
file: ASCII text, with CR line terminators

是否可以使用类似的过程来更改文件的 unicode 编码?我正在尝试以下方法,但不起作用:

$ file file.xml
file.xml: Unicode text, UTF-16, little-endian
$ vim file
:set encoding=utf-8
:wq
$ file file.xml
file.xml: Unicode text, UTF-16, little-endian

我看到someone say 他可以“设置 fileencoding=utf-8,然后更新并写入文件,它就可以工作”,但我似乎遗漏了一些东西,否则他很困惑。我不知道他说的“然后更新”是什么意思。

【问题讨论】:

    标签: vim unicode


    【解决方案1】:

    auto GUIEnter * 设置编码=utf-8 应该有帮助

    【讨论】:

      【解决方案2】:

      注意有区别

      set encoding

      set fileencoding

      在第一种情况下,您将更改终端中显示的输出编码。在第二种情况下,您将更改所写入文件的输出编码。

      【讨论】:

      • 谢谢! Apache 输出的是 utf-8,php 也是如此,所以浏览器说,vim 用set encoding 说,但页面仍然显示错位字符,就像 iso-8859-1 一样。使用set fileencoding 显示了一个漂亮的“Latin1”
      【解决方案3】:

      在读取文件之前在命令行上更改encoding 可能很有用:

      rem On MicroSoft Windows
      vim --cmd "set encoding=utf-8" file.ext
      # In *nix shell
      vim --cmd 'set encoding=utf-8' file.ext
      

      请参阅starting--cmd

      【讨论】:

      • 第一个变体也应该适用于 *nix shell。 'single quotes' 只需要转义所有元字符,这通常不是你想要的。
      【解决方案4】:

      来自doc

      :写++enc=utf-8 russian.txt

      因此,您应该能够在写入命令中更改编码。

      【讨论】:

      【解决方案5】:

      虽然使用 vim 是完全可能的,但为什么不简单地使用 iconv 呢?我的意思是 - 加载文本编辑器只是为了进行编码转换似乎使用太大的锤子太小的钉子。

      只是:

      iconv -f utf-16 -t utf-8 file.xml > file.utf8.xml
      

      你已经完成了。

      【讨论】:

      • 缺点,iconv 在 Windows 上可能不容易使用。
      • @AdrianoVaroliPiazza 既不是 vim。
      • 我会说多次“只需安装”下载,甚至是便携版”都构成“轻松可用”。
      • @adriano-varoli-piazza 不,正如@coder-tim 所说,iconv 在 Windows 上与 Cygwin 和 MingW 可用。
      • @mario 不,Vim 在 Windows 上很容易使用:vim.org/download.php#pc
      【解决方案6】:

      就像您的步骤一样,设置文件编码应该可以工作。但是,我想添加一个“设置炸弹”来帮助编辑器将文件视为 UTF8。

      $ vim file
      :set bomb
      :set fileencoding=utf-8
      :wq
      

      【讨论】:

      • 感谢您的回答,它使我了解了有关 UTF 字节顺序标记的更多信息。但是仅供参考,对于 UTF-8 设置 BOM 似乎是不必要/不可取的,因为它不是像 16 或 32 这样的固定字节长度格式。有关说明和参考,请参阅 here。这对 vim 来说不是问题(甚至有帮助),我只是认为人们应该意识到它可能会导致其他地方的兼容性问题。
      • bomb还是bom,可以是unset吗? 编辑:是的,你可以通过set nobomb删除它。
      • 是的,VIm 为我们设置了bomb(带有 b)。
      • 根据文档,如果 :set fenc=utf-8.. 参见 :he bomb,则 :set bomb 处于打开状态
      • 我们所有的基本编码现在都属于 UTF-8