Файл проекта Visual Studio 2008 не загружается из-за непредвиденного изменения кодировки - PullRequest
7 голосов
/ 23 марта 2010

В нашей команде есть проект базы данных в 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 портит кодировку файл проекта, по-видимому, в случайное время и в случайные машины?
  • Что мы должны сделать, чтобы предотвратить это?
  • Когда это произошло, есть ли возможность восстановления тока вместо этого файл в правильной кодировке потянув старую версию из контроль источника?

И последнее замечание: проблема в одном файле проекта, все остальные файлы проекта не раскрывают эту проблему.

ОБНОВЛЕНИЕ: благодаря предложению Джона Скита у меня есть ответ на вопрос номер три. Когда я заменяю первые девять байтов EF BB BF EF BF BD EF BF BD на два байта FF FE, файл проекта загружается снова.

Это оставляет вопрос, почему Visual Studio повреждает файл.

1 Ответ

4 голосов
/ 24 марта 2010

Я думаю, что могу дать некоторое представление о , что происходит , если не почему.

FF FE является спецификацией ; его присутствие в начале файла указывает на то, что кодировка файла - UTF-16, little-endian. И это звучит так, как будто исходный файл действительно является UTF-16, но что-то игнорирует спецификацию и читает ее так, как будто это UTF-8.

Когда это происходит, каждый из байтов FF и 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, когда данные не могут быть сохранены в кодовой странице». Это звучит как нечто, что может привести к изменению кодировки в случайное время.

...