首页 > 解决方案 > 如何在 VIM 中将 Windows 控制台输出转换为 utf8

问题描述

我想从 gvim 执行系统命令并在当前缓冲区中检索该命令的输出。所以我在 gvim 中运行以下命令:

:r echo éèà

然而,结果显示三个黑色方块而不是回显的字符。我还没有弄清楚该怎么做才能让它发挥作用。我有以下编码设置:

set encoding=utf8
set termencoding=cp850

我的 Windows 控制台编码是 cp850。

标签: vim

解决方案


TL;博士

:r! echo éèà | c:\cygwin\bin\iconv -f cp850 -t cp1252

假设

我已经能够使用 gvim 7.4 在我的 Windows 10 机器上重现您的问题,通过 gvim 的 Windows 安装程序安装。

我的机器上也有 cygwin,我有iconv,它的完整路径是c:\gygwin\bin\iconv.

建议的解决方案

显然,gvim 期望 Windows shell 的输出在 cp1252 中,因为这对我有用:

:r! echo éèà | c:\cygwin\bin\iconv -f cp850 -t cp1252

我检查了结果,Vim 在我的文档中正确插入了 éèà 的 utf-8 字符。

我没有iconvWindows 原生的等价物,但如果你有 Cygwin,你可以添加c:\cygwin\bin到你的 Windows 路径,并且该命令不需要显式路径。

结语

呸。这很丑陋。该解决方案至少在我的机器上有效,但我希望有人找到并发布更优雅的解决方案。

应该有一种方法可以告诉 gvim 期望从 shell 得到什么编码,但我没有找到它。我玩了 , 的各种设置组合encodingtermencodingfileencoding不是使用iconv,但只设法得到不同的错误结果。

这些相关问题面临类似的问题,但他们的解决方案在我的测试中也不起作用:

问题源于cmd.exe(Windows 上的 vim 中的默认值:set shell)与 gvim 期望的字符编码不匹配。我不知道为什么改变:set termencoding不能解决问题。


推荐阅读