正在阅读ISO 8859 1编码,使用Web客户端下载xml流

本文关键字:Web 使用 客户端 下载 xml 编码 ISO 8859 | 更新日期: 2023-09-27 18:20:30

我正在尝试进行一个基本的Web客户端调用,为WP7的后期跟踪应用程序获取xml流。它确实有效,我确实得到了xml,但问题是,由于我住在瑞典,我们有特殊的字符,如åöä等。对于这些字符,我只得到一个里面有问号的框。

我想要得到的xml文件如下:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?> 
<pactrack version="2.0" date="Sat Jan 14 18:29:26 CET 2012" size="2125" lang="SE">
    <header>
        <noofparcelentries>1</noofparcelentries> 
...

所以编码是ISO-8859-1,我想这就是我的问题。我试着在论坛上阅读这里的解决方案,有些人说支持这种格式,而有些人则不支持:正在读取iso-8859-1 rss提要C#WP7

我一直试图向客户端添加不同的编码,但似乎没有任何帮助,我的xml总是缺少特殊的符号。然而,有一种奇怪的行为让我有点害怕,如果我添加了一个错误的跟踪号码,而不是用特殊字符输入的数字,我可以突然读取一些特殊字符,我从服务器获得的xml是一条包含跟踪号码的错误消息,见下文,但xml定义是相同的。

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<pactrack version="2.0" date="Sat Jan 14 18:34:43 CET 2012" size="389" lang="SE" >
<header>
<noofparcelentries>1</noofparcelentries>
<noofuniqueparcels>1</noofuniqueparcels>
</header>
<body>
<parcel id="8538öööåå54248SE">  //I can read this road of xml suddenly
  <customerref></customerref>
  <internalstatus>0</internalstatus>

有人有什么想法吗?我是一个初学者,完全被这个问题弄糊涂了,所以任何帮助都将不胜感激!第一个xml和第二个xml有什么区别吗?在我看来,也许我看不到嵌套在节点中的特殊章程,这会是问题吗?

    WebClient client = new WebClient();
    public MainPage()
    {
        InitializeComponent();
        client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
        client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
    }
    void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        if (e.UserState as string == "mobiforge")
        {
            txtStatus.Text = e.BytesReceived.ToString() + "bytes received.";
        }
    }
    public void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        if (e.Error == null && !e.Cancelled)
        {
            MessageBox.Show(e.Result);
        }
    }
    private void btnDownload_Click(object sender, RoutedEventArgs e)
    {          
       client.DownloadStringAsync(new Uri("http://server.logistik.posten.se/servlet/PacTrack?lang=SE&kolliid=85380954248SE"), "posten"); 
    }  

正在阅读ISO 8859 1编码,使用Web客户端下载xml流

根据此MSDN页面,Silverlight中仅支持以下四种编码:

  • utf-8 UTF8编码

  • utf-16 UnicodeEncoding(little-endian)

  • utf-16BE UnicodeEncoding(big-endian)

  • utf-16LE UnicodeEncoding(little-endian)

根据你链接中的一个答案,用户只需稍微调整一下上半部分的字符就可以让它工作了。我想这对你没用吧?

您可以下载原始字节(OpenReadAsync)并对原始字节执行自己的编码,而不是DownloadStringAsync。这个程序可能会帮助你开始这方面的工作。

编辑-注意到MSDN页面底部有一条注释,说明支持ISO-8859-1。当你尝试这个时会发生什么:

client.OpenReadAsync(new Uri("http://server.logistik.posten.se/servlet/PacTrack?lang=SE&kolliid=85380954248SE"), "posten");

然后,在回调中,使用编码器读取数据。

var enc = Encoding.GetEncoding("iso-8859-1");
using (var reader = new StreamReader(e.Result, enc))
{
     var result = reader.ReadToEnd();
     Debug.WriteLine(result);
}