【问题标题】:Windows7 PowerShell inserts ^@ between every characters - how to prevent?Windows 7 PowerShell 在每个字符之间插入 ^@ - 如何防止?
【发布时间】:2012-06-29 10:15:58
【问题描述】:

希望对你来说这很容易回答。

我在 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。

【问题讨论】:

    标签: vim powershell windows-7


    【解决方案1】:

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

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

    【讨论】:

    • 奇怪的是它没有帮助,症状看起来就像它应该有帮助。不幸的是,由于我没有 Windows 和 PowerShell,我无法进一步帮助您。
    【解决方案2】:

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

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 谢谢克里斯蒂安。将在星期一尝试并通知您。
      • mvn -version | Out-File test -encoding Unicode vim test 二进制零仍然存在。很遗憾。设置内容也一样。
      • 由于 Out-File 使用的默认编码是 Unicode (Get-Help Out-File -Parameter Encoding),如果您想使用遗留程序,指定非默认值(如 UTF8 甚至 ASCII)会更有意义像 vim 这样不识别现代编码。
      • 将 Vim 称为遗留程序不符合我所知道的遗留程序的定义。 :-) :-P 将尝试并发布结果。如果您希望这被接受(如果可行,则会发生)然后将其发布为答案。
      • 您的回答有效,Emperor - 谢谢!如果您将此作为答案发布,我会接受。运行 dir | OutFile -Encoding UTF8 test 会创建一个在 Vim 中出现的没有二进制零的文件。如果我使用 Encoding to OEM、ASCII 和我测试过的其他两种方式运行,也会发生同样的情况。
      【解决方案4】:

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

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

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

      【讨论】:

      • 这对我有用。关键是 ucs-bom(由于各种原因,我有 utf-8、iso8859-1、ibm850,但是前面的 ucs-bom 为我解决了同样的问题)。
      猜你喜欢
      • 1970-01-01
      • 2020-01-31
      • 2014-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      相关资源
      最近更新 更多