使用特殊字符读取CDATA部分的问题(ISO-8859-1编码)

时间:2009-06-15 17:06:37

标签: c# xml silverlight encoding iso-8859-1

我正在尝试读取xml流并将其加载到集合中。

这有效,但我在阅读特殊字符时遇到困难。

E.g。如果我的xml看起来像这样

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<persons>
<person>
 <firstname>
 <![CDATA[ Sébastien ]]> 
  </firstname>
  <lastname>
   <![CDATA[Ørvåk]]> 
  </lastname>
</person>
</persons>

我尝试使用linq读取值

var persons = from p in doc.Elements("persons").Elements("person") select p;
string firstname = person.Element("firstname").Value;
string lastname = person.Element("lastname").Value;

但是在ØrvåkØ和å/Sébastien中,é给出了奇怪的字符。

有谁知道什么是错的?我猜它不使用编码ISO-8859-1。

由于

3 个答案:

答案 0 :(得分:3)

扩大别人给出的答案:

有两种可能性:

  1. 该文件实际上编码为UTF-8,但您的xml解析器将其解释为ISO-8859-1
  2. 该文件实际上编码为ISO-8859-1,但您的xml解析器将其解释为UTF-8
  3. 要确定哪个是哪个,请查看éSébastien的内容。我可以想象出两种可能性:

    1. é”成为两个不同的角色 - 可能是“é
    2. é”成为单个无意义的字母或“?”,名称b中也可能缺少“Sébastien”。
    3. 在第一种情况下,您的文件不是您认为的。 (它以UTF-8数据的形式进入您的程序,但您的程序正在尝试将其解释为ISO-8859-1)使用十六进制编辑器或其他可以显示字节的字节来查看xml文件磁盘是。

      在第二种情况下,我将检查localhost上的HTTP服务器如何提供此文件。 (您的程序以ISO-8859-1格式获取字节,但将其解释为UTF-8)在Windows上执行此操作的最简单方法是打开cmd提示符,然后运行命令: telnet localhost 80

      当弹出窗口时,键入以下行(或从stackoverflow中剪切并粘贴),然后按两次Enter键。警告:您将无法看到您正在键入的内容,并且大写非常重要。

      GET /Test/person.xml HTTP/1.0
      

      在回复中,查找以Content-Type开头的行。这将告诉您本地Web服务器如何提供文件。

      更新:看了你的文件后,它确实是iso-8859-1,所以我建议在你之前设置你的Webclient实例的.Encoding属性告诉它下载文件:

      client.Encoding = System.Text.Encoding.GetEncoding("iso-8859-1")
      

      或者,您可以使用DownloadBytes方法而不是DownloadString方法,然后将字节解析为xml文件。目前的问题是,当xml解析器获取文件内容时,字节已被解释为字符串,因此在那里更改编码为时已晚。

答案 1 :(得分:1)

该文件可能不在ISO-8859-1中,但是使用的是UTF-8。你能提供内容的十六进制转储吗?有时XML文件的编写者不小心编码字符串。

此外,可能是XML文档是通过HTTP发出的,而HTTP标头声明编码不正确。 XML specification中的第4.3.3节规定MIME规则覆盖文档本身所声明的内容。

如果您将自己的代码指向链接而不是本地副本,则可能意味着您的本地Web服务器配置不正确...

答案 2 :(得分:0)

您在后续跟踪中提到的XML文件是完全正确的。因此,您的错误特定于您的Javascript代码。