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