【问题标题】:Git: Diff does not handles character encoding other than UTF-8?Git:Diff 不处理 UTF-8 以外的字符编码?
【发布时间】:2016-07-29 09:19:00
【问题描述】:

创建了一个 repo,添加了包含以下内容的 UTF8 和 Latin2 编码文件:

árvíztűrő tükörfúrógép
ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP

https://github.com/bimlas/git-test/commit/872370caf91f1faaf931c1228c797f3d10d6435d

git log -p 82904e60 的输出为:

commit 82904e60d1940c036c8190e2a41de6b423727a7c
Author: BimbaLaszlo <bimbalaszlo@gmail.com>
Date:   Mon Jul 27 14:38:35 2015 +0200

    initial commit

diff --git a/fileencoding/latin2.txt b/fileencoding/latin2.txt
new file mode 100644
index 0000000..7165bc9
--- /dev/null
+++ b/fileencoding/latin2.txt
@@ -0,0 +1,2 @@
+<E1>rv<ED>zt<FB>r<F5> t<FC>k<F6>rf<FA>r<F3>g<E9>p^M
+<C1>RV<CD>ZT<DB>R<D5> T<DC>K<D6>RF<DA>R<D3>G<C9>P^M
diff --git a/fileencoding/utf8.txt b/fileencoding/utf8.txt
new file mode 100644
index 0000000..80e1878
--- /dev/null
+++ b/fileencoding/utf8.txt
@@ -0,0 +1,2 @@
+árvíztűrő tükörfúrógép^M
+ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP^M

我在 Linux 和 Windows(我的语言环境是 Latin2)上得到了相同的输出。尝试不使用寻呼机 (git --no-pager log -p 82904e60),没有转义码得到了相同的结果:

commit 82904e6
Author: BimbaLaszlo <bimbalaszlo@gmail.com>
Date:   2015-07-27 14:38:35 +0200

    initial commit

diff --git a/fileencoding/latin2.txt b/fileencoding/latin2.txt
new file mode 100644
index 0000000..7165bc9
--- /dev/null
+++ b/fileencoding/latin2.txt
@@ -0,0 +1,2 @@
+�rv�zt�r� t�k�rf�r�g�p
+�RV�ZT�R� T�K�RF�R�G�P
diff --git a/fileencoding/utf8.txt b/fileencoding/utf8.txt
new file mode 100644
index 0000000..80e1878
--- /dev/null
+++ b/fileencoding/utf8.txt
@@ -0,0 +1,2 @@
+árvíztűrő tükörfúrógép
+ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP

latin2.txt的日志是一样的,所以问题不是在一个输出中混合了不同编码的文件造成的。

如何设置 Git 以在没有分页器的情况下打印字符?

编辑

我认为问题与终端无关,例如在 Windows PowerShell 上 latin2.txt 很好,但 utf8.txt 很奇怪:

【问题讨论】:

  • 这需要 git a) 识别编码(如果没有关于哪个文件编码方式的元数据,这是不可能的,我敢肯定你没有在任何地方添加)和 b) 转换编码到您的显示编码,这是我不确定 git 应该参与的任务。

标签: windows git powershell encoding utf-8


【解决方案1】:

Git 根本不关心字符编码。一个文件只是一堆字节。

显示由您的终端完成。如果将其配置为解码为 UTF-8,则您的 latin-2 文件似乎已损坏。如果将其配置为解码为 latin-2,则您的 UTF-8 文件似乎已损坏。

也许encoding 属性(请参阅git help gitattributes)能够为一些工具提供如何正确解码文件的提示,但我从未使用过它。 例如,github 可能足够聪明,可以查看此属性并以不同方式解码这些文件。

【讨论】:

  • 我认为这与终端无关:请参阅问题的结尾。在我看来,gitattributes 有点 hacky:手动设置每个文件是问题的温床。
  • @Bimba 它你的终端!正如 michas 所说:如果您的终端期待 latin2,那么 UTF-8 数据会出现损坏,反之亦然。不同的终端给你不同的结果,这里没有什么大惊喜。 Git 只输出原始二进制数据,句号。它对编码没有任何作用。
  • @deceze:查看图像 - 同一终端上的相同文件具有不同的输出?
  • 在windows上cat有一些隐藏的魔法转换编码:stackoverflow.com/a/24841904/1870481
  • @michas Windows 不使用任何 magic - 如果文本文件以 BOM 开头,则假定为 Unicode,否则使用系统区域设置。事实上,在以后的版本中,“系统区域设置”标签已被“非 Unicode 程序使用的代码页”取代。一些程序(例如记事本)确实会尝试猜测文件是否是 Unicode,即使没有 BOM,例如通过检查前几个字符是否以 NUL 开头,除非它使用 Unicode 编码(UTF -8, -16)
猜你喜欢
  • 2010-09-21
  • 1970-01-01
  • 2010-11-25
  • 2014-06-09
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
相关资源
最近更新 更多