由于意外的编码更改,Visual Studio 2008 项目文件无法加载
-
21-09-2019 - |
题
在我们的团队中,我们在 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。
当这种情况发生时,每个字节 FF
和 FE
被视为无效并转换为 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”。这听起来可能会导致编码在明显随机的时间发生变化。