Windows 7 PowerShell在每个字符之间插入^ @ - 如何防止?

时间:2012-06-29 10:15:59

标签: vim powershell windows-7

希望对你而言,回答这一点很简单。

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

所以,而不是

r96130

我有

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

任何想法如何(首选)防止它或(罚款)摆脱它?

我试过替换,但显然这不仅仅是^ @,它是二进制零(我认为)所以它不会在/^@上找到。

编辑:

1)尝试将设置编码设置为UTF-8(我正在处理的内容的编码)和UTF-16(每个 @Philippe Wendler 的答案,谢谢),但无济于事。< / p>

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

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

的解决方案!

感谢@ Emperor XLII 提供解决方案!在评论中发布此处可能不够明显:

dir | OutFile -Encoding UTF8 test 

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

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

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

我有同样的问题。使用cmd shell(或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

希望有所帮助。

答案 2 :(得分:1)

在powershell中尝试使用

重定向文件
set-content c:\file.txt -encoding Unicode # or BigEndianUnicode

您也可以以相同的方式使用out-file

答案 3 :(得分:1)

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

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

fileencodings设置为ucs-bomutf-16可以解决您的问题。