Git 无法从 UTF-8 编码到 UTF-16LE-BOM

Git failed to encode from UTF-8 to UTF-16LE-BOM

提问人:elo 提问时间:6/12/2023 更新时间:11/1/2023 访问量:222

问:

我的存储库中有很多旧版 Windows 资源文件 (*.rc)。最初,它们具有 UTF-8、ASCII、UTF-16 或其他编码。此外,我的存储库中没有 .git属性,因此 git 无法为 UTF-16 文件生成差异并将它们视为二进制文件。

在我的分支中,我已将所有 *.rc 文件转换为带有 CRLF 行尾的 UTF-16LE-BOM,并添加了带有 .(我已将所有文件转换为 UTF-16,以仅使用 *.rc 掩码,而不是显式列出所有文件。dev**/*.rc text working-tree-encoding=UTF-16LE-BOM eol=CRLF

但是当我克隆我的存储库并尝试分支时,我看到了很多错误,所以看起来 git 将它们视为 UTF-8,而不管 .gitattributes 内容如何。此外,在签出后,所有 *.rc 文件都会损坏。git checkoutdevfailed to encode '...' from UTF-8 to UTF-16LE-BOM

以前:

#include <winver.h>

// Version Information
#ifndef _DEBUG

后:

#include <winver.h>
਍ഀഀ
// Version Information
਍⌀椀昀渀搀攀昀 开䐀䔀䈀唀䜀ഀഀ

另外,如果我在结帐后输入,git 会显示 .git statusfailed to encode '...' from UTF-16LE-BOM to UTF-8

有什么办法可以解决这个问题吗?

GIT UTF-8 UTF-16

评论

0赞 JosefZ 6/13/2023
你面临一个 mojibake 情况(例如在 Python 中具有普遍的可理解性):结果 (并且,奇怪的是,给出了相同的字符串)。'⌀椀昀渀搀攀昀 开䐀䔀䈀唀䜀ഀഀ'.encode('utf-16-le').decode('utf-16-be')'#ifndef _DEBUG\r\r''⌀椀昀渀搀攀昀 开䐀䔀䈀唀䜀ഀഀ'.encode('utf-16-be').decode('utf-16-le')'#ifndef _DEBUG\r\r'

答:

1赞 MikeOnline 11/1/2023 #1

.gitattributes 文件的文档包含用于配置 UTF-16 文件的工作树编码的示例,这些文件(1) 具有字节顺序标记 (BOM),或 (2) 缺少字节顺序标记。解释一下:

如果 UTF-16 文件具有 BOM,请设置 .Git 显然会检查 BOM 以区分小端序和大端序。working-tree-encoding=UTF-16

如果 UTF-16 文件缺少 BOM,请根据正在使用的文本编码设置 或。working-tree-encoding=UTF-16LEworking-tree-encoding=UTF-16BE

文档中从未提及编码类型;但是,Git 支持从终端(或从 Windows 上的 Git Bash)运行时可用的编码。 在 Ubuntu 18.04 或 Windows 10 上均未显示为受支持的编码。UTF-16LE-BOMiconv --listUTF-16LE-BOM