解决 Windows PowerShell 中 Git 中文编码问题

解决 Windows PowerShell 中 Git 中文编码问题

最近在Windows下做项目,需要把git diff的内容输出到文件里写commit message。本以为一个简单的重定向就能搞定,结果遇到了一个有趣的问题:所有的中文都变成了乱码。

一开始用了最简单的方式:

git diff > output.txt

结果文件里的中文全变成了"鎳掑姞杞介潪鍏抽敭缁勪欢"。

这当然是UTF-8和GBK的编码转换出问题了。

于是开始了一系列尝试。首先想到的是PowerShell的Out-File命令,它允许指定输出编码:

git diff | Out-File -Encoding utf8 -FilePath changes.txt

但问题依然存在。检查了一下输出,发现PowerShell的编码处理比想象中要复杂得多。

接着尝试从git配置入手:

git config --global core.quotepath false
git -c core.quotepath=false diff > changes.txt

这个方案解决了文件名的中文显示问题,但文件内容的中文还是乱码。

经过一番研究,发现这个问题涉及到了多个层面:PowerShell的控制台编码、git的输出机制,以及Windows的默认编码。最终找到了一个完整的解决方案:

[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
git --no-pager diff | Out-File -FilePath changes.txt -Encoding utf8

这个方案之所以有效,是因为它同时处理了三个关键点:

  1. 通过设置Console的OutputEncoding,确保PowerShell能正确处理UTF-8输出
  2. 使用git的--no-pager选项,避免了git分页机制带来的编码转换问题
  3. 使用Out-File并指定UTF-8编码,确保文件写入时使用正确的编码

如果你也遇到类似的问题,希望这个解决方案能帮到你。毕竟在Windows下开发,应对各种编码问题已经成了必备技能。