使git diff正确显示UTF8编码字符

40

我有一个包含瑞典字符(åäö)且使用UTF8编码的文件。

如果我使用cat命令来查看文件,它会正常显示,但是如果我使用git diff命令进行比较,特殊字符会被打印为<F6>等。

例如,git diff 命令输出的示例:

-            name: 'Magler<F6>d, S<F6>der<E5>sen',

我想要看到的是:

-            name: 'Magleröd, Söderåsen',

我发现另一个与git和编码问题有关的问题:git, msysgit, accents, utf-8, the definitive answers 它说所有问题应该在git版本1.7.10中得到解决。我有1.8.1.2版本。

我该怎么做才能使git diff正确显示åäö?


4
你确定你的文件是UTF-8格式吗? xF6 是ISO-8859-1编码中表示 ö 的代码,而 xE5 是表示 å 的代码。 - matt
1
file -bi filename.txt 给我返回了 text/plain; charset=utf-8 - Tobbe
3
我猜想 file 只是注意到它不是 ASCII,并没有进行任何广泛的测试来验证它是否为有效的 UTF-8 文件(如果实际的字节值是0xf6和0xe5,就不会是有效的UTF-8代码点,因为紧随其后的字节没有设置第7位,而这是必须的)。 file 可能只是“猜测”它是UTF-8格式 - 我相信它没有循环遍历所有可用的编码并进行测试... - twalberg
3个回答

78

git正在转储原始字节。在这种情况下,它并不关心您的文件编码是什么。您看到的突出显示的 <F6> 来自于 less,它可能被配置为您的 PAGER。尝试设置:

LESSCHARSET=UTF-8

8
如果你希望将更改永久保存(而不是每次登录到计算机时都需要使用命令export LESSCHARSET=utf-8),只需将其添加到~/.bashrc文件中即可。 - DiegoDD
5
另一种选项是在您的 ~/.gitconfig.git/config 中设置环境变量。在我的情况下,我在 [core] 部分中有 pager = LESSCHARSET=utf-8 less -R - dbort
对于任何正在运行Docker的人:请记住,您需要在Dockerfile中使用ENV来设置全局环境变量。例如:ENV LESSCHARSET=utf-8 - Fabien Snauwaert
1
另一个可能性是,如果您正在使用PowerShell,则可以按照此处所述设置[Console] :: OutputEncoding = [System.Text.Encoding] :: UTF8:https://dev59.com/Ca7la4cB1Zd3GeqPZDQ4 - Andreas

4

@matt和@twalberg是正确的。该文件实际上并不是UTF-8编码。由于我的终端(hterm)无法正确输入åäö(但它可以显示和复制/粘贴它们),这使得我很难弄清楚问题所在...

iconv -f ISO-8859-1 -t UTF-8 in.txt > out_utf-8.txt

解决了我的问题


2
实际上,即使命令行有点冗长,您也可以查看差异而无需写入中间文件:git diff --color | iconv -f iso-8859-1 -t utf8 | less -r,其中 --color 强制 git 输出ASCII颜色到管道,而 -r 强制 less 将这些颜色转义流式传输到终端。 - SnakE
如果其他人遇到了同样的问题,我试过这个命令,但是iconv告诉我它不认识utf8编码。通过使用iconv -l获取编码列表,我找到了名为utf-8的编码,所以对于我来说,命令是:git diff --color | iconv -f iso-8859-1 -t utf-8 | less -r - FcoJavier99

3

使用less而不是vi打开git日志。

因此,您应该将语言设置为less。

$ export LESSCHARSET=utf-8 && git log


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