如何告诉TortoiseHg将UTF-16文件显示为非二进制文件?

时间:2011-07-04 15:22:57

标签: ms-access unicode mercurial tortoisehg

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

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

  

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

在这个假设下是可以理解的。但是这个文件只是通常的源代码。我可以在Windows的记事本中查看它,没有任何问题。

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

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

3 个答案:

答案 0 :(得分:5)

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

说服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

答案 1 :(得分:3)

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

  

自然会出现这样的问题,无论如何,什么是二进制文件?事实证明这个问题确实没有好的答案,因此Mercurial使用与diff(1)这样的程序使用相同的启发式方法。测试只是文件中有任何NUL字节。

     

对于diff,export和annotate,这几乎在所有时间都会正确,并且它不会尝试处理它认为是二进制的文件。 如有必要,您可以强制使用-a。

将这些命令视为文本

答案 2 :(得分:1)

在提出问题时不存在此功能,但是现在有了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将将文件视为二进制文件。