【问题标题】:Retroactively convert a UCS-2 file to UTF-8 in Git在 Git 中追溯将 UCS-2 文件转换为 UTF-8
【发布时间】:2013-09-19 12:52:56
【问题描述】:

我的 Git 存储库中有一个包含多个提交的文件,它以 16 位 Unicode (UCS-2) 编码,供 Windows 使用。

因此,Git 将其视为二进制文件,而不是文本文件,我看不到不同提交所做的更改。

有没有办法将该文件追溯转换为 UTF-8,即重建历史记录,就好像该文件一直是 UTF-8 一样,我一直将它作为 UTF-8 文件提交,而不是 16 -bit Unicode 文件?

【问题讨论】:

    标签: git utf-8 ucs2


    【解决方案1】:

    要追溯重新编码文件,请使用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 以便重新编码命令不会失败,并且可以选择抑制错误输出。

    【讨论】:

    • 请注意,文件名是相对于仓库根目录的,所以在指定文件时,应该是git filter-branch --tree-filter 'recode utf-16..utf-8 relative/path/to/file'。起初这让我很困惑。
    • FWIW - 如果您正在使用由 Windows 生成的文件,这些显然通常是“UCS-2 Little Endian”,至少在我正在处理的内容中(WER 错误报告) - 所以而不是iconv 命令中的utf-16,你想要UCS-16LE
    • @rpavlik UTF-16 是 UCS-2 的超集,就像 UTF-8 是 ASCII 的超集一样。 (现在很少使用真正的 UCS-2,因为它不能表示 BMP 之外的代码点。)在您的 iconv 中指定 UTF-16 实际上不起作用吗?
    • 好吧,使用 Windows 的 git 附带的 iconv,如果我只是说 utf16,我从一个我期望本质上是 ASCII 的文件中获取东亚字符。一个文本编辑器说它是 UCS-2 Little endian,所以我认为要么没有字节顺序标记,要么 iconv 咒语忽略字节顺序标记,因为只有当我明确指定 UCS-2LE 时,输出才会按预期工作。
    • @rpavlik 您可以尝试指定UTF-16LE 吗?这至少应该和 UCS-2LE 一样好用,只是没有提到过时的“UCS-2”名称。
    猜你喜欢
    • 1970-01-01
    • 2010-10-29
    • 2016-08-14
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    相关资源
    最近更新 更多