1

我有一个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>

从我最喜欢的文本编辑器中,我可以看出这个文件以 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 调试器显示文件名 =□.txt

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

怎么了?

4

3 回答 3

5

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

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

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

编辑:

我刚刚偶然发现了 Microsoft 的KB308061。有一段很有意思:

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

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

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

于 2010-12-09T14:15:57.250 回答
3

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

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

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

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

使用Unicode 代码图表查找指定的字符。

于 2010-12-09T14:16:04.150 回答
0
  1. 您的 xml 是否正确定义了其编码?encoding="iso-8859-15" .. 是 Iso-latin-15

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

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

我不知道 € 的确切转义码 .. 但它会是这种东西

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

以上应该使€通过xml正确通信。

于 2010-12-09T14:20:48.000 回答