0

我正在尝试在 C#(特别是 Unity 2017.4.33f1)中修改一个 utf-16 编码的 XML 文件。

编辑:原来原始文件指定了 utf-8 编码!

我正在使用以下代码加载文档:

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

从调试器检查对象时,XDocument 似乎已将文档的声明加载为 UTF-8,即使原始文档指定了 UTF-16。

XDocument 的调试器视图

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

4

1 回答 1

0

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

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

XDocument.ToString()将文档编码为 UTF-16 并将该 XML 作为字符串输出,并将文档内编码声明更改为 utf-16,而不管对象/源文件中指定的编码.NET 字符串始终是 UTF-16 编码的,因此这可能是此行为的来源。.NET 正在输出有效的 XML,但不是准确反映ToString()所调用 XDocument 对象的 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并将使用该编码保存文件。

于 2019-10-25T20:05:49.967 回答