2010-03-23 47 views
7

在我们的团队中,我们在Visual Studio 2008中有一个由Team Foundation Server进行源代码控制的数据库项目。每两周左右,在一位同事签入后,项目文件将不会加载到其他开发人员计算机上。错误消息是:Visual Studio 2008项目文件因为意外的编码更改而无法加载

项目文件无法加载。根级别的数据无效。 1号线,位置1

当我看到在记事本项目文件++,这个文件看起来是这样的:

��<NUL?NULxNULmNULlNUL NULvNULeNULrNULsNULiNULoNULnNUL ...

等(你可以在此看到<?xml version ) 而一个正常的项目文件看起来像:

<?xml version="1.0" encoding="utf-16"?> ...

所以大概什么是错与ENC编码文件。这对我们来说是一个问题,因为它不可能再次获得正确的文件编码。 '解决方案'是扔掉项目文件,从源代码管理中获取最新的工作版本。

根据该文件,编码应该是UTF-16。根据记事本++,损坏的文件实际上是UTF-8。

我的问题是:

  • 为什么Visual Studio中搞乱了编码 项目文件, 显然在随机时间,并在 随机计算机?
  • 我们该怎么做才能防止这种情况?
  • 当它发生时,是否有 恢复当前 文件的正确编码,而不是 拉动 源代码控制的旧版本?

作为最后一个提示:问题是一个单独的项目文件,所有其他项目文件不公开此问题。

更新:感谢Jon Skeet的建议,我对第三个问题有了答案。 当我用两个字节FF FE替换前9个字节EF BB BF BF BF BD EF BF BD时,项目文件将再次加载。

这仍然是Visual Studio破坏文件的原因。

+0

如果您在破损文件和工作文件之间进行二进制比较,您会看到什么?我不知道这是否是一个UTF-16排序问题。 – 2010-03-23 10:14:08

+0

如果我做了一个二进制比较,结果证明这些文件是indentical,除了正确的一个在开始时有两个额外的字节FF FE,并且已损坏的一个有额外的九个字节EF BB BF EF BF BF BD BF BD。 – Xenan 2010-03-23 10:38:58

回答

4

我想我可以提供一些洞察到什么是发生,如果不是原因。

FF FEBOM;它在文件开头的存在表明该文件的编码是UTF-16,是小端。这听起来像是原始文件真的是UTF-16,但有些东西忽略了BOM并将它看作是UTF-8。

发生这种情况时,每个字节FFFE被视为无效并转换为U+FFFD,即官方Unicode垃圾回收字符。然后,再次将文本写入文件时,每个垃圾字符都会转换为其UTF-8编码(EF BF BD),并在其前面添加BOM(EF BB BF),从而导致九个字节序列您报道:

EF BB BF # UTF-8 BOM 
EF BF BD # U+FFFD in UTF-8 
EF BF BD # ditto 

如果是这种情况,只需更换FF FE的9个字节是不是安全。不能保证这些文件中的唯一字节在解释为UTF-8时无效。只要该文件只包含ASCII字符,您就可以,但其他任何内容(如重音字符(é)或卷曲引号())都将无法修复。

项目文件是否应该是UTF-16?如果不是,那么当版本控制系统期望UTF-8时,也许这个开发人员的系统正在生成UTF-16。我注意到在我的Visual C#Express安装中有一个Environment->Documents下的选项,名为“当数据无法保存在代码页中时将文档另存为Unicode”。这听起来像是可能导致编码在明显随机时间改变的事情。

+0

谢谢,这真的给了一些见解。 – Xenan 2010-03-25 08:19:42

相关问题