5

希望对你来说这将是微不足道的回答。

我在 Win7 上有 gvim 和 vim。每当我将命令结果重定向到文件并使用 Vim(或 Gvim,相同效果)打开它时,我都会在每个字符之间插入二进制 0(^@ 符号)。

所以,而不是

r96130

我有

^@r^@9^@6^@1^@3^@0^@

知道如何(首选)防止它或(很好)摆脱它吗?

我尝试了替换,但显然这不仅仅是 ^@,它是一个二进制零(我认为)所以它没有被/^@.

编辑:

1)尝试将编码设置为 UTF-8(我正在处理的内容的编码)和 UTF-16(根据@Philippe Wendler的回答,谢谢),但无济于事。

2) __PowerShell__ 是有罪的一方。当我在常用命令行(通过cmd)上进行重定向时,没有副作用。只有在 PowerShell 会话上创建的文件才会插入这些二进制零。

3)@Christian提到的 Powershell 好东西没有帮助。当我切换到 Ubuntu 作为我的主要操作系统并在那里使用 Vim 时,我将留下未回答的问题,所以这里唯一的“解决方案”现在是不使用 PowerShell + Vim,这显然是缺乏答案。:-)

解决方案!

感谢@Emperor XLII的解决方案!在这里发布,因为它是在评论中,所以可能不够明显:

dir | OutFile -Encoding UTF8 test 

创建一个在 Vim 中出现的没有二进制零的文件。如果我使用 Encoding to OEM、ASCII 和我测试过的其他两种方式运行,也会发生同样的情况。

一个有希望的提示在于:he 'fileencodings'- 是的,复数,由@Dan Fitch 撰写,但我还没有测试它,因为我那时已经离开了 Win7。

4

4 回答 4

4

Windows 内部使用UTF-16作为 Unicode 编码,这个文件看起来也使用 UTF-16,但 vim 用 8 位字符集(可能是 latin1)解释它。

尝试:set encoding=utf-16在 vim 中选择正确的编码。

于 2012-06-29T10:20:31.517 回答
3

我遇到过同样的问题。使用cmdshell(或 Console2)并运行如下命令:

prompt> myBatFile.bat > myOutputFile.log

我会得到一堆^@符号,我可以使用只运行以下命令的宏来摆脱它们:

:s/\r\(\n\)/\1/g

这对我来说是可以接受的,但很烦人(我相信这是具有不同的 unix 与 Dos 样式的回车以及在文件末尾没有行尾的组合)。更糟糕的是,我在迁移到 Windows 7 后就开始使用 PowerShell。一旦发生这种情况,我不仅得到了^@符号,而且我还在文件开头^M加上了一个 (我认为那是一个字节ÿþgVIM 无法正确解释的订单标记)。

无论如何,我更改了调用 bat 文件的方式,使其遵循 PowerShell 重定向方式,现在在 gVIM 中读取文件没有问题:

prompt> myBatFile.bat | Out-File myOutputFile.log -encoding UTF8

希望有帮助。

于 2012-10-23T14:20:35.357 回答
1

在powershell中尝试使用重定向文件

set-content c:\file.txt -encoding Unicode # or BigEndianUnicode

你也可以用out-file同样的方式使用

于 2012-06-29T11:30:43.670 回答
1

您不必对 Powershell 的输出做任何特别的事情。您可以更改您的 vim 配置,以便它可以处理正确的编码。

查看:he fileencodings(注意尾随的 s)——此设置允许您选择 vim 将尝试的编码。默认情况下,Vim 7.x 将使用ucs-bom并尝试解码字节顺序标记,但您vimrc可能设置了不同的列表;确保它不是以latin1. 默认情况下,在我的 x64 Windows 7 机器上,通过管道传输到文件的 Powershell 命令输出可以被 vim 读取。

设置fileencodingsucs-bomutf-16应该解决您的问题。

于 2012-10-23T16:10:14.173 回答