XmlDocument.Load()方法无法解码€(欧元)

rds*_*rds 1 c# xml encoding xml-deserialization

我有一个file.xml用Iso-latin-15(又名Iso-Latin-9)编码的XML文档

<?xml version="1.0" encoding="iso-8859-15"?>
<root xmlns="http://stackoverflow.com/demo">
  <f>€.txt</f>
</root>
Run Code Online (Sandbox Code Playgroud)

从我最喜欢的文本编辑器,我可以告诉这个文件在Iso-Latin-15中正确编码(它不是UTF-8).

我的软件是用C#编写的,想要提取元素f.

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("file.xml"); 
Run Code Online (Sandbox Code Playgroud)

在现实生活中,我有一个XMLResolver来设置凭据.但基本上,我的代码就是这么简单.装载进展顺利,我没有任何例外.

现在,我提取值时的问题:

//xnsm is the XmlNameSpace manager
XmlNode n = xmlDoc.SelectSingleNode("//root/f", xnsm); 
if (n != null)
  String filename = n.InnerText;
Run Code Online (Sandbox Code Playgroud)

Visual Studio调试器显示filename = ?.txt

它可能只是一个Visual Studio错误.不幸的是File.Exists(filename)返回false,而文件实际存在.

怎么了?

VVS*_*VVS 6

如果我没记错的话,该XmlDocument.Load(string)方法始终采用UTF-8,无论XML编码如何.

您必须StreamReader使用正确的编码创建一个并将其用作参数.

xmlDoc.Load(new StreamReader(
                     File.Open("file.xml"), 
                     Encoding.GetEncoding("iso-8859-15"))); 
Run Code Online (Sandbox Code Playgroud)

编辑:

我只是偶然发现了微软的KB308061.有一个有趣的段落:

在XML文档的XML声明部分中指定编码声明.例如,以下声明表明该文档采用UTF-16 Unicode编码格式:

<?xml version="1.0" encoding="UTF-16"?>
Run Code Online (Sandbox Code Playgroud)

请注意,此声明仅指定XML文档的编码格式,不会修改或控制数据的实际编码格式.