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

时间:2010-12-09 14:10:39

标签: c# xml encoding xml-deserialization

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

<?xml version="1.0" encoding="iso-8859-15"?>
<root xmlns="http://stackoverflow.com/demo">
  <f>€.txt</f>
</root>

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

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

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("file.xml"); 

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

现在,当我提取值时出现问题:

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

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

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

怎么了?

3 个答案:

答案 0 :(得分:6)

如果我没记错,XmlDocument.Load(string)方法总是假定为UTF-8,无论XML编码如何。

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

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

修改

我偶然发现了微软的KB308061。有一段有趣的段落:

  

在中指定编码声明   XML的XML声明部分   文献。例如,以下内容   声明表明了   document是UTF-16 Unicode编码   格式:

<?xml version="1.0" encoding="UTF-16"?>
     

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

答案 1 :(得分:4)

不要只使用调试器或控制台将字符串显示为字符串。

相反,转储字符串的内容,一次一个字符。例如:

foreach (char c in filename)
{
    Console.WriteLine("{0}: {1:x4}", c, (int) c);
}

这将根据Unicode代码点向您显示字符串的真实内容,而不是受当前字体可以显示的内容约束。

使用Unicode code charts查找指定的字符。

答案 2 :(得分:0)

  1. 您的xml是否正确定义了其编码? encoding =“iso-8859-15”..是Iso-latin-15

  2. 理想情况下,您应将内容放在CDATA元素中..所以xml看起来像<f><![CDATA[€.txt]]></f>

  3. 理想情况下,您还应该使用等效的url编码(或http编码)值来转义所有特殊字符,因为xml通常用于通过http进行通信。

  4. 我不知道€的确切转义码。但它会是这种类型的

    <f><![CDATA[%3E.txt]]></f>
    

    以上内容应通过xml正确传达。