如何在Vim或gVim中查看UTF-8字符

126

我时常处理包含非英语脚本的网页,它们中的大多数都是使用UTF-8编码的。

Vim和gVim不能正确地显示这些UTF-8字符。

我在Windows 7上使用Vim 7.3.46 64位,并在_vimrc中使用set guifont=Monaco:h10

有没有办法解决这个问题?

更新:我已经搜索了一下,发现set guifontwide作为区域语言的第二个备选项。

我在_vimrc中添加了以下行,解决了我的大部分问题。

set enc=utf-8
set fileencoding=utf-8
set fileencodings=ucs-bom,utf8,prc
set guifont=Monaco:h11
set guifontwide=NSimsun:h12

上述NSimsun字体适用于中文。问题是,我不知道他们如何让该字体名称在Vim中起作用,《Courier New》被称为《Courier_New》,而《NSimsun》在字体目录中没有出现。我想使用的字体是《Latha》,但是我不知道如何在_vimrc文件中使用它。代码set guifontwide=latha:h12set guifontwide=Latha:h12都没有起作用。

如果我成功设置了guifontwidelatha,那么我的问题就解决了。该怎么做呢?


'guifont' 的值和 'guifontwide' 的值是什么?另外,您使用的操作系统和 vim 版本是什么? - Benoit
Sathish,你能找到这个问题的解决方案吗?我正在尝试使用eKalappai软件在gVim中输入,但vim只显示??字符(显然以相同的方式保存)。 - Sundar R
@sundar 不行,我放弃了 :| - Sathish Manohar
我的问题是inconsolata-g字体不支持我文档中的utf-8字符。 - AndrewPK
使用 set guifontwide=NSimsun:h12 对我来说失败了,显示“无效的宽字体”,可能是同样的非等宽字体问题吗? - mikew
9个回答

73

你尝试过吗?

:set encoding=utf-8
:set fileencoding=utf-8

?


7
我尝试了这两个设置,但仍然无法看到 utf-8 字符。 - Sathish Manohar
1
实际上这是行不通的。这两个选项都无法重新加载文件。第一个选项将修改 vim 内部存储缓冲区(和其他内容)的方式,第二个选项将指定您希望更改已经在缓冲区中加载的文件的编码,在保存时生效。 - Benoit
:set encoding=utf8 命令将刷新缓冲区,如果问题在于不正确的编码,它将修复它。我添加了 set fileencoding=utf8 选项,这样你就不会遇到最令人困惑的“无法转换某些字符”错误了。 - Maxim Sloyko
设置编码起作用了。我在 .vimrc 文件中添加了 set encoding=utf8 ,现在 utf8 的所有内容都可以正常显示。 - Alexander Kim
谢谢!这对我有用。 - U. W.
显示剩余2条评论

71

尝试使用以下方法重新加载文档:

:e! ++enc=utf8

如果这能起作用,你或许应该在你的 .vimrc 文件中改变 fileencodings 设置。


2
对我来说没有任何改变。 - Thomas Levesque
9
在运行之前请先保存您的工作,因为运行操作会清除您所做的更改。但如果您输入“:u”,将会帮您保存。 - user636044
同时,当你执行此操作时,它会将文件设置为只读模式,因此你还需要运行:set noro来取消只读模式。 - Matt Vukomanovic
2
谢谢。在我的情况下,Vim没有呈现utf-8,因为我有一块二进制数据(multipart/form-data附件部分)。当我执行:e! ++enc=utf8时,它确实呈现了utf-8,但是在文件内部抱怨[ILLEGAL BYTE in line 286](第一个二进制部分行)。我猜默认行为是在Vim打开时静默地回退到其他编码。不过,由于某种原因,在这种情况下,echo &enc仍然报告utf-8。 - Dmitry Minkovsky
1
@DmitryMinkovsky,“&enc”是vim内部用于存储缓冲区内容的编码。包含当前文件编码的设置是“&fenc”。 - Benoit
这个方法在其他方法都不行的时候对我很有用,谢谢@Benoit。 - Grant Bowman

13
如果有日本人来这里,请将以下行添加到您的~/.vimrc文件中。
set encoding=utf-8
set fileencodings=iso-2022-jp,euc-jp,sjis,utf-8
set fileformats=unix,dos,mac

请参考此答案,了解有关日语字符的信息。 - Matthias Braun

6
在Linux中,打开VIM配置文件。
$ sudo -H gedit /etc/vim/vimrc

添加以下行:

set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8

保存并退出,然后在终端中输入命令:
$ source /etc/vim/vimrc

此时 VIM 将正确显示中文。


6
在Microsoft Windows上,gvim不允许您选择非等宽字体。不幸的是,Latha是一种非等宽字体。
有一种hack方法可以实现:使用FontForge(您可以从http://www.geocities.jp/meir000/fontforge/下载Windows二进制文件)编辑Latha.ttf并将其标记为等宽字体。操作如下:
  1. 加载fontforge,选择latha.ttf。
  2. 菜单:Element -> Font Info
  3. 在Font Info对话框的左侧列表中选择“OS/2”
  4. 选择“Panose”选项卡
  5. 设置比例=等宽
  6. 保存此字体的新TTF版本,尝试一下!
祝你好运!

1
我无法将Latha字体更改为等宽字体。我完全按照您的步骤操作,但保存的文件仍然不能作为等宽字体工作 :( - Sathish Manohar
1
@Sathish Manohar 1) 覆盖现有的TTF文件,重新启动Windows,然后尝试。或者2)您可以将TTF保存到新文件中并修改字体名称。安装新的TTF文件。这种新字体应该在您的列表中可用。 - Yi Zhao
7年过去了,现在有几种免费的字体可供VIM使用。Google Noto字体https://www.google.com/get/noto;和Iosveka https://github.com/be5invis/Iosevka/releases是非常好的选择。 - Yi Zhao

6

这对我有用,不需要更改任何配置文件。

vim --cmd "set encoding=utf8" --cmd "set fileencoding=utf8" fileToOpen


2

我在Windows的GVim编辑器中无法显示安装的其他字体,所以我只好切换到具有较好UTF-8支持的Lucida Console字体。请在您的_vimrc文件末尾添加以下内容:

" For making everything utf-8
set enc=utf-8
set guifont=Lucida_Console:h9:cANSI
set guifontwide=Lucida_Console:h12

现在我至少能看到一些UTF-8字符。

在我的情况下,我必须将cANSI更改为cGREEK(在GVim中编辑->选择字体...),并使用Consolas字体,以便正确显示带有希腊字符的UTF-8编码文本文件。 - hello_earth

2
这个问题解决了吗?
我遇到了一个问题,gvim无法显示所有unicode字符(只包括umlaut和重音符号等子集),而:set guifont?为空;请参见我的问题。在这里阅读之后,将guifont设置为合适的值可以解决问题。但是,我不需要超过2个字节的字符。

1
guifont的合理值是什么?你放了什么进去? - Christian
我在这个答案中列出了对我有效的值。 - Tobias

1
在Windows的gvim中,只需选择“Lucida Console”字体。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接