2010-03-23 20 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

相關問題