在Windows 10的CLI终端中,使用'git log'命令时可能会遇到编码问题。

101

问题

我该如何使git log命令的输出在Windows CLI终端中正确显示?

示例

Git commands sequence leading to the problem

正如您所见,我可以正确输入变音字符,但在git log中,输出结果却被转义了。根据UTF-8编码表,输出结果中尖括号(<>)之间的代码对应于先前键入的git config参数。

我尝试将LESSCHARSET环境变量设置为utf-8,如类似问题的一个答案中建议的那样,但输出结果变得混乱无序:

'git log' output after setting LESSCHARSET=utf8

我知道 .git/config 是以 UTF-8 正确编码的,因为它被 gitk 正常处理。

Proper gitk output

如果需要,这里是locale命令的输出:

LANG=
LC_CTYPE="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_ALL=

输出结果在纯粹的Git Bash中也是相同的:

Enter image description here

所以我相信问题与shell无关,而是与Git或其配置本身有关。


2
你试过在"Unicode characters in Windows command line - how?"中提供的解决方案吗? - jthill
是的,我尝试了几个代码页,包括65001(UTF-8),但没有任何结果。看起来chcp命令对git log输出的显示没有影响。它总是以相同的方式显示。 - Marcin Kłopotek
1
抱歉如果问题听起来很愚蠢,但是为什么你会使用Windows命令提示符而不是Git Bash呢?Git Bash更适合使用Git,窗口大小可以调整到全屏,提示符会自动显示您所在的分支等。 - kriegaex
1
这并不是愚蠢的@kriegaex,实际上很好。我正在使用包装在ConEmu中的git-bash进行日常使用。结果是相同的http://i.imgur.com/hMKz9D3r.png。我用cmd.exe描述了我的问题,以免将人们与我正在使用的其他依赖工具混淆,因为我认为问题与Shell无关,而是与Git或其配置本身有关。 - Marcin Kłopotek
@jthill 谢谢,这个答案看起来可以解决问题,https://dev59.com/3XRC5IYBdhLWcg3wK9yV#55674760 - Monday Fatigue
8个回答

175

好的,我做了一些实验并发现Windows Git命令实际上需要类似于LC_ALL的UNIX变量才能正确显示波兰语(或其他UTF-8字符)。只需尝试此命令:

set LC_ALL=C.UTF-8

然后享受结果。这是我的控制台上发生的情况(字体为“Consolas”,无需chcp):

Windows console CMD


更新:

  • 为了使Windows命令(如在控制台上显示文件的type)正常工作,您需要chcp 65001
  • 如果您更喜欢来自Git Bash的cat命令,则可以从上述set LC_ALL=C.UTF-8中受益。

Windows console CMD, part 2


更新2:如何使更改永久生效

正如用户mono blaine所说,创建一个环境变量LC_ALL,并将其分配为C.UTF-8的值,可以全局设置或仅针对您自己的用户配置文件(德语截图抱歉):

Create environment variable

下次打开命令处理器控制台(cmd.exe)时,当输入命令echo %LC_ALL%时,您应该能够看到变量值。在PowerShell中,当输入$env:LC_ALL时,您应该能够看到它。
使UTF-8代码页永久的最简单方法是打开regeedit,并在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor部分中添加一个名为Autorun的新值,类型为字符串,并将其分配值chcp 65001

Registration editor

因此,每次打开新的cmd.exe控制台时,都将执行此命令。您甚至可以在新窗口中看到其输出:“Aktive Codepage:65001。”(或以您所用语言为准的类似内容)。
顺便说一下:为了在PowerShell中正确显示UTF-8编码的文件,您可以使用Get-Content -encoding UTF8 file.txtcat -encoding UTF8 file.txt(其中cat是PowerShell中Get-Content的别名)。

Git本身不需要设置LC_ALL。其他与Git一起安装的工具,如默认分页器less(请参见core.pager),会使用LC_ALL值。其他有效的值是本地化语言,例如:对于德国人,可以设置LC_ALL=de_DE.UTF-8 - return42
1
您可以使用命令行设置环境变量,使用“setx LC_ALL C.UTF-8”。 - anion
在ConEmu中使用PowerShell 6,只需将$env.LC_ALL='ClUTF-8'添加到$Profile即可。 - Andrew Spencer
rscript工具(用于运行R代码的命令行工具)存在编码问题,这些建议帮助解决了问题。谢谢! - SliceOfTuna

73

如果有人对于 set LC_ALL=C.UTF-8 的 PowerShell 等效命令感兴趣,那么它是:

$env:LC_ALL='C.UTF-8'

然而这仅适用于当前会话。要使其永久,有两种可能性:

  • 创建一个名为LC_ALL的环境变量,其值为C.UTF-8
  • 或将$env:LC_ALL='C.UTF-8'放入您的$Profile文件中

1
或将其添加到您的PowerShell配置文件中(我更喜欢这个方法,因为我在多台机器上使用相同的配置文件 - 通过git) - Richard
3
配置文件可以通过运行以下命令进行编辑: notepad $profile 然后按照mono blaine的建议,在某个地方添加一行, $env:LC_ALL='C.UTF-8' - Tore Aurstad
使用PowerShell 6 + ConEmu在Windows 10上:这个可以工作,不需要其他任何东西。 - Andrew Spencer

11

我正在使用 Windows Terminal 上的 Windows 10 中的 PowerShell Core v7.0.3 通过 Git 进行操作。

我已经浏览了很多答案并尝试了许多方法。对我有效的解决方案是:

这两个解决方案都可以单独使用。我选择使用 Git 命令,因为问题似乎与 Git 相关,并且 PowerShell 配置文件保持干净。


1
感谢 Git 设置。Git 设置对我很有效,但也发现在 Windows 终端中的 PowerShell 5 中设置 $env:LESSCHARSET='utf-8' 也能正常工作。 - mloskot

7

我在Windows 10上使用Git Bash。对我来说,有四个设置使得它的外观符合我的期望。

  • env设置。全局添加LC_ALL=C.UTF-8LESSCHARSET=UTF-8PATH

  • git配置。执行git config --global i18n.logOutputEncoding utf-8

  • Git Bash设置。将选项文本字符集设置为utf-8。或者将locale字符集都设置为default。它会智能地选择正确的编码

完成。


1
我在Windows命令提示符上使用git,前两个步骤解决了我的问题。 - nglee
前两步骤有助于解决 VS Code 时间轴编码问题。 - Mx.Wolf

2
我的解决方案(从PowerShell 7.3.6在Win 10上调用的git log)
[console]::OutputEncoding = [System.Text.Encoding]::UTF8

这对我来说很有效,谢谢! - undefined

1

我在Linux上遇到了这样的问题。问题是我没有生成本地化设置。因此,我的locale输出包含所有"C"字母,没有UTF-8。

为了解决这个问题,我在/etc/locale.gen中取消注释了en_US.UTF-8ru_RU.UTF-8。然后我运行了localectl set-locale LANG=ru_RU.UTF-8并重新启动了系统。之后重新登录系统,西里尔字母就正常显示了。


1

我不得不使用Windows PowerShell命令提示符,而不是默认的一个(Windows键+X)。


它对于韩国人来说非常有效。 - Park JongBum

0
git config --global core.pager 'less --raw-control-chars'
 
#Or

git config --global core.pager 'more'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接