Чтение кодировки ISO 8859 1, загрузка xml stream с веб-клиентом - PullRequest
4 голосов
/ 14 января 2012

Я пытаюсь позвонить обычному веб-клиенту, чтобы получить поток XML для приложения отслеживания сообщений для WP7. Это работает, и я получаю 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 и втором? Мне кажется, может быть, я не вижу специальных чартеров, вложенных в узлы, может ли это быть проблемой?

    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"); 
    }  

1 Ответ

4 голосов
/ 14 января 2012

Согласно этой странице MSDN в Silverlight поддерживаются только эти четыре кодировки:

  • utf-8 UTF8Кодирование

  • utf-16 UnicodeEncoding (little-endian)

  • utf-16BE UnicodeEncoding (big-endian)

  • utf-16LE UnicodeEncoding (little-endian)

Согласно одному из ответов в вашей ссылке, пользователю удалось заставить его работать с небольшим изменением верхней половины символов. Я полагаю, это не сработало для вас?

Вместо DownloadStringAsync вы можете загрузить необработанные байты (OpenReadAsync) и выполнить свою собственную кодировку необработанных байтов. Эта программа может помочь вам начать работу с этим аспектом.

Редактировать - Заметил комментарий внизу страницы 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);
}
...