我有一个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,而文件确实存在。
怎么了?
答案 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)
您的xml是否正确定义了其编码? encoding =“iso-8859-15”..是Iso-latin-15
理想情况下,您应将内容放在CDATA元素中..所以xml看起来像<f><![CDATA[€.txt]]></f>
理想情况下,您还应该使用等效的url编码(或http编码)值来转义所有特殊字符,因为xml通常用于通过http进行通信。
我不知道€的确切转义码。但它会是这种类型的
<f><![CDATA[%3E.txt]]></f>
以上内容应通过xml正确传达。