我有一个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,而文件实际上是存在的。
怎么了?
发布于 2010-12-09 22:16:04
不要只使用调试器或控制台将字符串显示为字符串。
相反,转储字符串的内容,一次一个字符。例如:
foreach (char c in filename)
{
Console.WriteLine("{0}: {1:x4}", c, (int) c);
}这将以Unicode代码点的形式向您显示字符串的实际内容,而不是受当前字体可以显示的内容的限制。
使用Unicode code charts查找指定的字符。
发布于 2010-12-09 22:15:57
如果我没记错的话,XmlDocument.Load(string)方法总是假定使用UTF8,而不管编码是什么。
您必须使用正确的编码创建一个StreamReader,并将其用作参数。
xmlDoc.Load(new StreamReader(
File.Open("file.xml"),
Encoding.GetEncoding("iso-8859-15"))); 编辑:
我偶然发现了微软的KB308061。有一段很有趣的话:
XML在
文档的XML声明部分中指定编码声明。例如,以下声明指示文档采用UTF-16UNICODE编码格式。请注意,此声明仅指定文档的编码格式,并不修改或控制数据的实际编码格式。
发布于 2010-12-09 22:20:48
元素中。因此,xml看起来像<f><![CDATA[€.txt]]></f>
进行通信。
我不知道欧元的确切转义代码..但它会是这样的东西
<f><![CDATA[%3E.txt]]></f>以上内容应该可以使make能够通过xml正确地进行通信。
https://stackoverflow.com/questions/4399105
复制相似问题