c# - 读取ISO 8859 1编码,用webclient下载xml流

标签 c# xml windows-phone-7 encoding webclient

我正在尝试进行基本的网络客户端调用,以获取用于 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,我想这是我的问题。一直试图在论坛上阅读解决方案,有人说支持该格式,而有些则不支持: Reading iso-8859-1 rss feed 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"); 
    }  

最佳答案

根据这个MSDN page , Silverlight 只支持这四种编码:

  • utf-8 UTF8Encoding

  • utf-16 UnicodeEncoding (little-endian)

  • utf-16BE UnicodeEncoding (big-endian)

  • utf-16LE UnicodeEncoding (little-endian)

根据您链接中的一个答案,用户已经设法通过对字符的上半部分进行轻微调整来使其正常工作。我认为这对您不起作用?

您可以下载原始字节 (OpenReadAsync) 并在原始字节上执行您自己的编码,而不是 DownloadStringAsyncThis program可能会帮助您开始这方面的工作。

编辑 - 注意到 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);
}

关于c# - 读取ISO 8859 1编码,用webclient下载xml流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8864148/

相关文章:

python - 使用带有标签的 ElementTree 从 XML 检索文本时遇到问题

xml - 更改 XML 中所有属性的标签名称

android - 水平弯曲滑动菜单

c# - Windows Phone 7,条件矩形填充到新的 ImageSource 可能吗?

windows-phone-7 - WP7上的CameraCaptureTask

c# - 使用免费的 C# 解决方案将 pdf 转换为 jpeg

c# - 仅使用正整数时返回负值

c# - CS0034 C# 运算符 '-' 在类型为 'long' 和 'ulong' 的操作数上不明确

c# - 退出(Quit)实现

c# - 为什么 LINQ to SQL 将 GroupBy 翻译成多个查询