0

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

这行得通,但我在阅读特殊字符时遇到了困难。

例如,如果我的 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。

谢谢

4

3 回答 3

3

要扩展其他人给出的答案:

有两种可能:

  1. 该文件实际上编码为UTF-8,但您的 xml 解析器将其解释为ISO-8859-1.
  2. 该文件实际上被编码为,ISO-8859-1但您的 xml 解析器正在将其解释为UTF-8.

要确定哪个是哪个,看看éin会发生什么Sébastien。我可以想象有两种可能性:

  1. é”变成了两个不同的字符——可能是“ é
  2. " é" 变成了一个无意义的字符或 " ?",并且可能b名称中也缺少 "" Sébastien

在第一种情况下,您的文件不是您认为的那样。(它作为数据进入您的程序UTF-8,但您的程序正试图将其解释为ISO-8859-1)使用十六进制编辑器或其他可以向您显示磁盘上的字节的东西查看 xml 文件。

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

当弹出一个窗口时,键入以下行(或从stackoverflow剪切和粘贴)并按两次回车。警告:您将无法看到您正在输入的内容,并且大小写很重要。

GET /Test/person.xml HTTP/1.0

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

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

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

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

于 2009-06-16T22:25:30.630 回答
1

该文件可能不是 ISO-8859-1 格式,而是 UTF-8 格式。你能提供内容的十六进制转储吗?有时,XML 文件的编写者并不注意编码字符串。

此外,可能是 XML 文档来自 HTTP,而 HTTP 标头声明的编码不正确。XML 规范中的第 4.3.3 节声明 MIME 规则覆盖文档本身的声明。

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

于 2009-06-15T17:38:31.440 回答
0

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

于 2009-06-16T09:24:51.673 回答