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

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

当我在 Notepad++ 中查看项目文件时,该文件如下所示:

��<NUL?NULxNULmNULlNUL NULvNULeNULrNULsNULiNULoNULnNUL ...

等等(你可以看到 <?xml version 在此),而普通项目文件看起来像:

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

所以文件的编码可能有问题。这对我们来说是一个问题,因为事实证明不可能再次使文件编码正确。“解决方案”是丢弃项目文件并从源代码控制中获取最新的工作版本。

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

我的问题是:

  • 为什么Visual Studio显然在随机时间和随机机器上弄乱了项目文件的编码?
  • 我们应该做什么来防止这种情况发生?
  • 当它发生时,是否有可能在正确的编码中恢复当前文件,而不是从源控件中提取旧版本?

最后一点:问题出在一个项目文件上,所有其他项目文件都不会暴露此问题。

更新:感谢乔恩·斯基特的建议,我得到了第三个问题的答案。当我用两个字节 FF FE 替换前九个字节 EF BB BF EF BF BD EF BF BD 时,项目文件将再次加载。

这仍然留下了为什么 Visual Studio 会损坏文件的问题。

有帮助吗?

解决方案

我想我可以提供一些见解 什么是 正在发生,如果不是为什么的话。

FF FE 是一个 物料清单;它出现在文件的开头表明该文件的编码是 UTF-16,little-endian。听起来原始文件确实是 UTF-16,但有些东西忽略了 BOM,并将其读取为 UTF-8。

当这种情况发生时,每个字节 FFFE 被视为无效并转换为 U+FFFD, ,官方 Unicode 垃圾字符。然后,当文本再次写入文件时,每个垃圾字符都会转换为其 UTF-8 编码(EF BF BD)和 UTF-8 物料清单(EF BB BF) 添加在它们前面,从而得到您报告的九字节序列:

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

如果是这种情况,只需将这九个字节替换为 FF FE 不安全。无法保证这些是文件中唯一在解释为 UTF-8 时无效的字节。只要文件只包含 ASCII 字符就可以,但是其他任何字符,例如重音字符 (é) 或大引号 (),将受到不可挽回的破坏。

项目文件真的应该是 UTF-16 吗?如果不是,则可能某个开发人员的系统正在生成 UTF-16,而版本控制系统需要 UTF-8。我注意到在我的 Visual C# Express 安装中,下面有一个选项 Environment->Documents 称为“当数据无法保存在代码页中时将文档另存为 Unicode”。这听起来可能会导致编码在明显随机的时间发生变化。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top