【问题标题】:Visual Studio 2008 project file does not load because of an unexpected encoding change由于意外的编码更改,Visual Studio 2008 项目文件无法加载
【发布时间】:2011-01-30 17:38:19
【问题描述】:

在我们的团队中,我们在 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 的建议,我知道了第三个问题的答案。 当我将前九个字节 EF BB BF EF BF BD EF BF BD 替换为两个字节 FF FE 时,项目文件将再次加载。

这仍然是 Visual Studio 损坏文件的问题。

【问题讨论】:

  • 如果您在损坏的文件和工作文件之间进行二进制差异,您会看到什么?我想知道这是否是 UTF-16 字节序问题。
  • 如果我做一个二进制差异然后结果证明文件是相同的,除了正确的文件在开头有两个额外的字节,FF FE,而损坏的文件有九个额外的字节 EF BB BF EF BF BD EF BF BD。

标签: visual-studio-2008 encoding project-files


【解决方案1】:

我想我可以提供一些关于发生了什么的见解,如果不是原因的话。

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

发生这种情况时,每个字节 FFFE 都被视为无效并转换为官方 Unicode 垃圾字符 U+FFFD。然后,当再次将文本写入文件时,每个垃圾字符都会转换为其 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-8 时,可能某个开发人员的系统正在生成 UTF-16。我注意到在我的 Visual C# Express 安装中,Environment->Documents 下有一个选项,称为“当数据无法保存在代码页中时,将文档另存为 Unicode”。这听起来像是可能导致编码在明显随机的时间发生变化的东西。

【讨论】:

  • 谢谢,这确实提供了一些见解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 2016-05-26
  • 1970-01-01
  • 2013-11-29
  • 2016-07-10
  • 2020-07-01
  • 1970-01-01
相关资源
最近更新 更多