Unity C # System.Xml.Linq - XDocument меняет кодировку в декларации XML - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь изменить файл XML в кодировке utf-16 в C # (в частности, Unity 2017.4.33f1).

РЕДАКТИРОВАТЬ: Получается исходный файл, указанный в кодировке utf-8!

Я загружаю документ, используя этот код:

using (FileStream fileStream = new FileStream(inPath, FileMode.Open, FileAccess.Read))
{
   _Document = XDocument.Load(fileStream);
}

При проверке объекта из отладчика XDocument, похоже, загрузил объявление документа как UTF-8, хотя в оригинальном документе указано UTF-16.

Debugger view of XDocument

Почему это происходит? Есть ли способ, чтобы остановить XDocument от изменения кодировки при загрузке файла?

1 Ответ

0 голосов
/ 25 октября 2019

tl; dr: использовать XDocument.Save() и его перегрузки

Судя по обсуждению в комментариях к вопросу, похоже, что это поведение реализации .NET в Unity 2017.4.33f1. :

XDocument.ToString() закодирует документ в UTF-16 и выведет этот XML в виде строки и изменит объявление кодировки в документе на utf-16, независимо откодировка указанная в объектном / исходном файле . .NET-строки всегда имеют кодировку UTF-16 , так что это вероятный источник такого поведения. .NET выводит действительный XML, но не XML, который точно отражает, что был вызван объект XDocument ToString(). Это означает, что код, подобный следующему:

XDocument doc = XDocument.Load(path); 
System.Encoding enc = System.Encoding.GetEncoding(doc.Declaration.Encoding);
System.IO.File.WriteAllText(path, doc.ToString(), enc);

будет записывать недопустимый XML, если документ изначально не был закодирован в UTF-16.

XDocument.Save(string path) учитывает кодировку, указанную вXDocument.Declaration и сохранит файл с этой кодировкой.

...