在Git中将一个UCS-2文件追溯地转换为UTF-8

5
我有一个文件在 Git 存储库中有多个提交,编码为 16 位 Unicode(UCS-2),用于 Windows。因此,Git 将其视为二进制文件而不是文本文件,我无法查看不同提交所做的更改。是否有一种方法可以将该文件追溯地转换为 UTF-8,即重建历史记录,就像该文件始终是 UTF-8 文件,并且我始终将其作为 UTF-8 文件提交,而不是 16 位 Unicode 文件?
1个回答

5

要对文件进行追溯编码,请使用git filter-branch

git filter-branch --tree-filter 'recode utf-16..utf-8 file'

如果您没有recode,请使用更长的iconv -f utf-16 -t utf-8 file -o file。 如果文件在树的早期版本中不存在,则可能需要附加|| true,以便重新编码命令不会失败,并可选择禁止错误输出。


1
请注意,文件名是相对于存储库的根目录的,因此在指定文件时,应为 git filter-branch --tree-filter 'recode utf-16..utf-8 relative/path/to/file'。这最初让我感到困惑。 - sashoalm
如果你正在使用Windows生成的文件,则通常为“UCS-2 Little Endian”。对于iconv命令,你需要使用UCS-16LE而不是utf-16。 - Ryan Pavlik
@rpavlik UTF-16是UCS-2的超集,有点像UTF-8是ASCII的超集。 (真正的UCS-2这些天很少使用,因为它无法表示BMP之外的代码点。)在您的iconv中指定UTF-16实际上不起作用吗? - user4815162342
使用随 Git for Windows 一起提供的 iconv,如果我只是说 utf16,那么我从一个本应是 ASCII 的文件中得到了东亚字符。一个文本编辑器显示它是 UCS-2 Little endian,所以我认为要么没有字节顺序标记,要么 iconv 咒语忽略了字节顺序标记,因为只有当我明确指定 UCS-2LE 时,输出才按预期工作。 - Ryan Pavlik
@rpavlik 你能尝试指定“UTF-16LE”吗?这应该至少和UCS-2LE一样有效,只是不再使用过时的“UCS-2”名称。 - user4815162342

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