【问题标题】:How can I tell TortoiseHg to display a UTF-16 file as non-binary?如何告诉 TortoiseHg 将 UTF-16 文件显示为非二进制文件?
【发布时间】:2011-09-28 05:42:49
【问题描述】:

在 Microsoft Access 2007 项目中,Access 表单对象通过专用软件使用内置功能“SaveAsText”导出到文件。这是必要的,因为 Access 不会将它的任何代码模块单独存储在独立的文件中。

文件以字节“FF FE”(根据http://de.wikipedia.org/wiki/Byte_Order_Mark 为UTF-16)开头。我推测由于该文件中有许多 NUL 字符,Hg 将此文件视为二进制文件。因此,TortoiseHG 工作台中的差异窗格总是告诉我们

文件或差异未显示:文件是二进制文件。

在这种假设下是完全可以理解的。但尽管如此,这个文件只是普通的源代码。例如,我可以在 Windows 的记事本中查看它而没有任何问题。

有没有办法告诉 Mercurial,这个特定文件应该被视为文本,而不是二进制文件?

编辑: 除了下面标记的首选答案之外,我决定不更改保存行为,而是使用“Visual Diff”命令(选择文件,然后按 Ctrl+d)。

【问题讨论】:

  • 我调整了标题和标签以显示这是关于 TortoiseHG 用户界面,它不是 Mercurial 的一部分。

标签: ms-access unicode mercurial tortoisehg


【解决方案1】:

我猜您经常或偶尔会导出表单对象以跟踪源代码更改。

让 Mercurial 相信文件不是二进制文件的唯一方法是避免使用 NUL 字节。

您可能希望将源代码文件转换为 ASCII(或者可能是 ANSI)编码作为导出中的附加步骤,以避免 NUL 字节。如果源代码文件包含 Unicode 字符,您可以尝试 UTF-8,因为这只会在必要时处理多字节字符,否则只处理单字节字符,从而避免再次出现 NUL 字节。我简单地尝试了一下,Mercurial 处理 UTF-8:它不显示“文件是二进制文件”,而是显示实际的差异。我在命令行上提交,但查看了 TortoiseHg 中的差异。我在下面有一个关于命令行编码挑战的链接。

hgrc encode/decode sections 在帮助将 UTF-16 文件过滤成更好的文件时可能特别有用。

关于 Mercurial 和编码的其他几页:

TortoiseHg 2.1 + Mercurial 1.9

【讨论】:

  • 非常感谢这个提示!您假设我在适当的时候导出这些对象是正确的。不幸的是,我自己没有编写导出函数,它是 Access 应用程序的一部分,它是闭源的。与此同时,我发现了这个 python 脚本,它可能让我有机会编写一个 en-/decoder:stackoverflow.com/questions/3015542/…
  • 我不是说要更改 Access 的导出功能,而是要添加一个步骤来处理 Access 提供给您的文件。我会重新措辞一下。
【解决方案2】:

来自https://www.mercurial-scm.org/wiki/BinaryFiles

问题自然就来了,到底什么是二进制文件?事实证明,这个问题确实没有好的答案,所以 Mercurial 使用了与 diff(1) 之类的程序相同的启发式方法。测试只是文件中是否有任何 NUL 字节。

对于 diff、export 和 annotate,这几乎可以始终正确处理,并且不会尝试处理它认为是二进制的文件。 如有必要,您可以使用 -a 强制这些命令将文件视为文本。

【讨论】:

  • 感谢您非常快速的回答 :-) 我意识到了这一点(但没有提及,抱歉),但我看不出有办法告诉 TortoiseHg 工作台记住这个文件的这个设置(或匹配给定过滤条件的文件)。
  • @Christoph Jüngling 您是否使用十六进制编辑器检查了 NUL 文件(如果我理解正确,不应该有)?如果没有,可能值得将其作为错误报告报告给 TortoiseHg 工作人员。
  • 我使用 wxHexEditor 进行检查。是的,里面有很多 00 个字符,我猜每秒一个。所以我明白为什么 Hg 或 TortoiseHg 将此文件视为二进制文件。不过我还是想告诉他们,这确实是一个普通的源代码文件,只是保存为UTF-16。上面提到的“-a”选项与“hg diff -a 文件名”一起使用,但即便如此,每个第二个字符都是一个点,这使得这个差异非常不可读。 TortoiseHg 完全拒绝显示差异(或内容)。
【解决方案3】:

在提出问题时这并不存在,但现在有 msaccess-vcs-integration 项目,它可以导出/导入 MS Access 对象,以便对其进行版本控制。

引用the project's readme:

编码

对于通常导出的 Access 对象 UCS-2-little-endian 编码,自动包含模块 在源代码与UTF-8 编码之间进行转换 进出口;这是为了确保您没有麻烦 在 Mercurial 等工具中进行分支、合并和比较 treat any file containing 0x00 bytes as a non-diffable binary file.

如果您使用它而不是直接使用 Access 的 SaveAsText 函数导出表单和模块,Mercurial 将将文件视为二进制文件。

【讨论】:

  • 感谢您的提示,@christian-specht。几年来,我使用OASIS,它的作用几乎相同。
猜你喜欢
  • 2011-08-10
  • 2010-10-02
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多