XDocument.Load默认采用哪种编码?

5
如果我使用 XDocument.Load 解析一个 XML 文件...
var x = XDocument.Load("somefile.xml");

...没有 <?xml version="1.0" encoding="..."?> 头部的 不包含...

<MyRootElement>
   ...
</MyRootElement>

...XDocument.Load默认使用的编码是什么?ANSI(即系统默认的传统区域设置)?UTF-8?还是其他编码?

我已经查看了文档,但在那里没有找到相关信息。我也查看了参考源代码,但在深入研究XmlReader源代码后放弃了。


1
我至少期望它遵循XML规范,并自动检测UTF-8或UTF-16:“虽然XML处理器只需要读取UTF-8和UTF-16编码的实体,但承认其他编码在世界各地使用,并且可能希望XML处理器读取使用它们的实体。在缺乏外部字符编码信息(例如MIME标头)的情况下,存储在除UTF-8或UTF-16之外的编码中的解析实体必须以包含编码声明的文本声明(请参见4.3.1文本声明)开头:” - Jon Skeet
它不会假设,而是自动检测。例如,它将正确处理带有BOM的UTF-16。我手头没有代码,但如果你很幸运,它实际上可能会遵循规范。值得注意的是:如果没有更好的指示,它将假定为UTF-8,而不是Encoding.Default - Jeroen Mostert
2
啊,这里。它专门自动检测Unicode。此外,请参阅其后的代码;如果没有BOM,则以ASCII开头,稍后根据是否存在声明进行切换。 - Jeroen Mostert
请注意,即使XML文件不包含BOM并且XML声明未指定编码,XDocument.Load()仍将正确加载使用UTF8编码的XML文件 - 即使文件中的某些字符没有ASCII等效项。 - Matthew Watson
@JeroenMostert:谢谢,这是一个很好的起点。显然,读取器仅使用SafeAsciiEncoder来读取<?xml ...头文件。如果没有这样的头文件存在,它会切换到UTF-8 - Heinzi
1个回答

6

在内部,它调用 XmlReader.Create(string, XmlReaderSettings)。这使它具有与该方法调用相同的默认设置。根据Jeroen's comment中的链接,流输入的编码是从BOM(如果没有BOM,则默认为ASCII)自动检测出来的。

然而,根据此答案,通过传递一个TextWriter(例如StreamWriter),可以覆盖默认编码:

StreamReader reader = new StreamReader("somefile.xml", Encoding.GetEncoding(1252));
var x = XDocument.Load(reader);

显然,读取器仅使用SafeAsciiEncoder来读取<?xml ...头。如果没有这样的头,则切换到UTF-8 - Heinzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接