C # WebClient - Получение символов вопросительного знака внутри квадрата вместо символов при загрузке страницы - PullRequest
0 голосов
/ 30 декабря 2010

Я использую WebClient для загрузки веб-страницы с норвежского сайта.И в загруженных данных все специальные символы (символы) отсутствуют и заменены на знак вопроса типа char.

Раньше я имел эту проблему на своей веб-странице, прежде чем я добавил "" в мой HTML-файл, этоприсутствует здесь.

Если я открываю браузер и просматриваю адрес, все выглядит нормально.

Я использовал fiddler, чтобы точно узнать, какие заголовки мне нужно отправить, и я использую, я отправляю всеточно так же, как мой браузер.

Так что с помощью дедукции я считаю, что WebClient является нарушителем, и каким-то образом калечит данные, прежде чем вернуть их мне, и я не уверен, как помешать ему это сделать.

Для получения дополнительной информации, это мой код для получения веб-страницы:

string result = string.Empty;

using (WebClient client = new WebClient())
{     
     client.Headers["Accept"] = "application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";
     client.Headers["Referer"] = "http://mywebsite.no/forum/viewforum.php?f=7";
     client.Headers["Accept-Language"] = "nb-NO";
     client.Headers["User-Agent"] = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; AskTbFXTV5/5.9.1.14019)";
     client.Headers["Accept-Encoding"] = "gzip, deflate";

     using (Stream stream = client.OpenRead(new Uri(textBox1.Text))) 
     { 
          using (StreamReader reader = new StreamReader(stream)) 
          {
               result = reader.ReadToEnd();
          } 
     } 
}

Любые советы?

Ответы [ 4 ]

0 голосов
/ 03 января 2011

Как уже говорили другие, вы, возможно, не установили правильную кодировку. См. , как определить кодировку тела ответа , которая показывает, как угадать кодировку из заголовков ответа или HTML-тега META в теле ответа.

0 голосов
/ 30 декабря 2010

Попробуйте использовать конструктор StreamReader, который задает кодировку.

http://msdn.microsoft.com/en-us/library/ms143456.aspx http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx

Чтобы выяснить кодировку страницы, в Firefox вы можете щелкнуть правой кнопкой мыши и выбрать View Page Info. Там должна быть указана кодировка.

0 голосов
/ 30 декабря 2010

Есть две вероятные причины:

  1. Вы не используете правильную кодировку для StreamReader.
  2. Вы отображаете результат, используя шрифт, который не поддерживаетсимволы.

Если вы знаете, что такое кодировка и знаете, что она останется прежней, вы можете просто предоставить кодировку при создании объекта StreamReader.

Если нет, вам придется поместить первую часть страницы в байтовый буфер, чтобы вы могли кодировать ее достаточно, используя простую кодировку ASCII, чтобы найти метатег содержимого, чтобы вы могли определить кодировку по ней.Затем вы можете декодировать буфер и остальную часть страницы, используя правильную кодировку.

Поскольку вы говорите «знаки вопроса внутри знака», а не просто знаки вопроса, это заставляет меня заподозритьчто он может отображать контент, который на самом деле является проблемой, а не декодировать его.Проблема декодирования приведет к появлению обычных вопросительных знаков, в то время как шрифты содержат специальный символ для пропущенных глифов, который выглядит точно так, как вы описали.

0 голосов
/ 30 декабря 2010

Вы пробовали установить кодировку в ответе?

        string result = string.Empty;

        using (WebClient client = new WebClient())
        {
            client.Headers["Accept"] = "application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";
            client.Headers["Referer"] = "http://mywebsite.no/forum/viewforum.php?f=7";
            client.Headers["Accept-Language"] = "nb-NO";
            client.Headers["User-Agent"] = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; AskTbFXTV5/5.9.1.14019)";
            client.Headers["Accept-Encoding"] = "gzip, deflate";

            using (Stream stream = client.OpenRead(new Uri("")))
            {
                byte[] resultBytes = StreamUtil.ReadToEnd(stream);
                result = System.Text.ASCIIEncoding.UTF8.GetString(resultBytes);
            }
        }

internal class StreamUtil
{
    internal static byte[] ReadToEnd(System.IO.Stream stream)
    {
        byte[] readBuffer = new byte[4096];

        int totalBytesRead = 0;
        int bytesRead;

        while ((bytesRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0)
        {
            totalBytesRead += bytesRead;

            if (totalBytesRead == readBuffer.Length)
            {
                int nextByte = stream.ReadByte();
                if (nextByte != -1)
                {
                    byte[] temp = new byte[readBuffer.Length * 2];
                    Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length);
                    Buffer.SetByte(temp, totalBytesRead, (byte)nextByte);
                    readBuffer = temp;
                    totalBytesRead++;
                }
            }
        }

        byte[] buffer = readBuffer;
        if (readBuffer.Length != totalBytesRead)
        {
            buffer = new byte[totalBytesRead];
            Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead);
        }
        return buffer;
    }
}
...