git diff 的输出在 powershell 中没有正确处理

And*_*eas 6 windows git powershell git-diff character-encoding

我已经阅读了几个关于这个问题的 QA,但没有一个提供答案。有一个变通方法,我在这里再次说明,但我想了解并解决问题。

问题

问题是git diff reva revb | Out-File mypatch.patch在 powershell中执行命令会产生“垃圾字符”来代替德语元音变音(?ñ 而不是 ä)。

调查

当我按照$Env:LESSCHARSET="utf8"某些 QA 中的建议执行时,我确实在终端中获得了正确的输出,但是一旦将其重定向到文件mypatch.patch,变音符号(和其他字符)就会被破坏。甚至git --no-pager diff reva revb会在终端中产生正确的输出。但是,一旦您想将其通过管道传输到文件,那就错了。你看到的不是你得到的!

在我看来,输入到Out-File已经被破坏,因此设置-Encoding参数不会改变任何东西。我不认为Out-File是这里的罪魁祸首。例如,该命令$mypatch = git diff reva revb(即使在 diff 之前添加了 --no-pager)会导致一个变量,例如欧元符号或变音符号在该变量被打印到终端时出现错位(Ôé¼ 而不是 €)。

我在 Windows 10 (1709) 上尝试了 powershell 5.1 和开源 powershell core 6.0.4。我使用 git 2.18.0.windows.1。它适用于 windows 命令行 (cmd),因此简单的解决方法是从 powershell 控制台调用:

解决方法

cmd /c "git diff reva revb > mypatch.patch"

这仅适用于 PowerShell 是如何工作的?

And*_*eas 5

该问题似乎是由错误设置引起的[Console]::OutputEncoding。如果未设置为 UTF8,请尝试设置:[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

如果您随后使用 也没关系$Env:LESSCHARSET,我相信它不再使用了。

  • 相反,在我的机器上(tm),仅单独修复“$Env:LESSCHARSET”就足以使“git diff”的输出正确渲染。OutputEncoding 设置不会造成损害,但不能修复特殊字符乱码的症状(例如“<C3><BC>”而不是“ü”)。 (2认同)