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
中指定的编码,并将使用该编码保存文件。
我正在尝试修改 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
中指定的编码,并将使用该编码保存文件。