Unity C# System.Xml.Linq - XDocument 更改 XML 声明中的编码

Unity C# System.Xml.Linq - XDocument changes the encoding in a XML declaration

我正在尝试修改 C# 中的 utf-16 编码 XML 文件(特别是 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。

为什么会这样?有什么方法可以阻止 XDocument 在加载文件时更改编码?

tl;dr:使用 XDocument.Save() 及其重载

根据问题评论中的讨论,这似乎是 Unity 2017.4.33f1 的 .NET 实现的行为:

XDocument.ToString() 将文档编码为 UTF-16 并将 XML 作为字符串输出 并更改文档内编码声明为 utf-16,无论 object/source 文件 中指定的编码如何。 .NET strings are always UTF-16 encoded,因此这可能是此行为的来源。 .NET 正在输出有效的 XML,但不是准确反映 XDocument 对象 ToString() 被调用的 XML。这意味着代码如下:

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

如果文档最初不是 UTF-16 编码,将写入无效 XML。

XDocument.Save(string path) 遵循 XDocument.Declaration 中指定的编码,并将使用该编码保存文件。