在我们的团队中,我们在 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 会搞乱编码
项目文件,
显然是在随机时间和在
随机机器?
- 我们应该做什么来防止这种情况发生?
- 当它发生时,是否有一个
恢复当前的可能性
改用正确的编码文件
从中提取旧版本
源头控制?
最后一点:问题出在一个项目文件上,所有其他项目文件都不会暴露此问题。
更新:感谢 Jon Skeet 的建议,我得到了第三个问题的答案。
当我用两个字节 FF FE 替换前九个字节 EF BB BF EF BF BD EF BF BD 时,项目文件将再次加载。
这仍然留下了为什么 Visual Studio 会损坏文件的问题。
我想我可以提供一些见解what's正在发生,如果不是为什么的话。
FF FE
is a BOM http://en.wikipedia.org/wiki/Byte_order_mark;它出现在文件的开头表明该文件的编码是 UTF-16,little-endian。听起来原始文件确实是 UTF-16,但有些东西忽略了 BOM,并将其读取为 UTF-8。
当这种情况发生时,每个字节FF
and FE
被视为无效并转换为U+FFFD
,官方 Unicode 垃圾字符。然后,当文本再次写入文件时,每个垃圾字符都会转换为其 UTF-8 编码(EF BF BD
)和UTF-8 BOM (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”。这听起来可能会导致编码在明显随机的时间发生变化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)