Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
kodzuru
20 / 19 / 22
Регистрация: 22.06.2016
Сообщений: 127
Завершенные тесты: 1
1

Кодировка консоли. Вместо HTML выводит "?"

16.06.2017, 16:53. Просмотров 348. Ответов 4
Метки нет (Все метки)

Доброго времени суток. Есть такой код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int ch;
            // First, create a WebRequest to a URI. 
            HttpWebRequest req = (HttpWebRequest)
                WebRequest.Create("http://www.pikabu.ru/");
 
            // Next, send that request and return the response. 
            HttpWebResponse resp = (HttpWebResponse) req.GetResponse();
 
            // From the response, obtain an input stream. 
            Stream istrm = resp.GetResponseStream();
            for (int i = 0;; i++)
            {
                ch = istrm.ReadByte();
                if (ch == -1)
                {
                    Console.Write((char)ch);
                    if (i%400 == 0)
                    {
                        Console.WriteLine("Нажмите ENTER");
                        Console.ReadLine();
                    }
                }
            }
            resp.Close();
На консоли должен быть виден HTML, а видны только вопросики. Что делать?

Добавлено через 5 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
for (int i = 0;; i++)
            {
                ch = istrm.ReadByte();
                if (ch == -1)
                    break;
                Console.Write((char)ch);
                if (i % 400 == 0)
                {
                    Console.WriteLine("Нажмите ENTER");
                    Console.ReadLine();
                }
 
            }
Сам спросил, сам ответил )
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2017, 16:53
Ответы с готовыми решениями:

Как использовать "-" вместо "+"?
Не нашел соответствующей темы. Даже не знаю как написать запрос чтобы погуглить. Уверен что...

Html Agility Pack в Windows Phone и ошибка "Следует добавить ссылку на сборку "System.Xml.XPath"
public BashPage() { InitializeComponent(); HtmlDocument doc =...

Парсинг HTML. Получение "правильного" html
Приветствую. Очевидно, парсю странички. Бигдата, разные сайты. Необходимо без использования...

Клиент-сервер в консоли: "одноразовая" отправка
Клиент: using System; using System.IO; using System.IO.Pipes; class PipeClient { static...

Ошибка после конвертации метода на С++ к С#: "Неявное преобразование типа "int" в "bool" невозможно"
Ошибка после преобразования метода на С++ к С#: "Неявное преобразование типа "int" в "bool"...

4
Kill100
429 / 295 / 81
Регистрация: 11.12.2010
Сообщений: 1,209
Завершенные тесты: 1
16.06.2017, 19:16 2
Можно проще
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.IO;
using System.Net;
using System.Text;
 
namespace ConsoleApplication1
{
 
    class Program
    {
        static void Main(string[] args)
        {
            // First, create a WebRequest to a URI. 
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.pikabu.ru/");
 
            // Next, send that request and return the response. 
            using (var resp = (HttpWebResponse)req.GetResponse())
            {
                // From the response, obtain an input stream. 
                using (var istrm = new StreamReader(resp.GetResponseStream(),Encoding.Default))
                {
                    while (!istrm.EndOfStream)
                    {
                        var line = istrm.ReadLine();
                        Console.Write(line);
                    }
                }
            }
 
            Console.ReadLine();
        }
    }
}
0
OwenGlendower
Супер-модератор
Эксперт .NET
11507 / 9691 / 4067
Регистрация: 17.03.2014
Сообщений: 19,339
Записей в блоге: 1
Завершенные тесты: 2
16.06.2017, 23:58 3
kodzuru, как проще уже показали. Теперь нужно показать как правильно. Ошибка в обоих примерах это неверная работа с кодировкой. Т.к. сам HttpWebRequest/HttpWebResponse нам здесь плохо помогает, необходимо дописать определение кодировки из заголовка Content-Type.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.pikabu.ru/");
using (var resp = (HttpWebResponse)req.GetResponse())
{
    var responseEncoding = Encoding.UTF8;
    
    Regex reCharset = new Regex("charset=([^;]+)", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
    Match m = reCharset.Match(resp.ContentType);
    if (m.Success) responseEncoding = Encoding.GetEncoding(m.Groups[1].Value);
 
    using (var reader = new StreamReader(resp.GetResponseStream(), responseEncoding))
    {
        Console.WriteLine(reader.ReadToEnd());
    }
}
Если есть возможность, то советую использовать класс HttpClient. Там таких проблем нет.
0
Kill100
429 / 295 / 81
Регистрация: 11.12.2010
Сообщений: 1,209
Завершенные тесты: 1
17.06.2017, 00:43 4
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Если есть возможность, то советую использовать класс HttpClient. Там таких проблем нет.
Но он только с асинхронными методами
Хотя не кто не мешает сделать их вызов синхронным DDDD
Ну а на счёт определения кодировки, ContentType меня вот всегда интересовал вопрос. а если там что-то экзотическое?
0
OwenGlendower
Супер-модератор
Эксперт .NET
11507 / 9691 / 4067
Регистрация: 17.03.2014
Сообщений: 19,339
Записей в блоге: 1
Завершенные тесты: 2
17.06.2017, 00:59 5
Цитата Сообщение от Kill100 Посмотреть сообщение
Ну а на счёт определения кодировки, ContentType меня вот всегда интересовал вопрос. а если там что-то экзотическое?
Мне не приходилось там встречать что-то экзотическое. В контексте приведенного примера скорее нужно предусмотреть ситуацию кодировки которая не поддерживается .NET-ом. Для этого можно добавить try/catch вокруг вызова Encoding.GetEncoding().
0
17.06.2017, 00:59
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2017, 00:59

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

Ошибка CS0019: Оператор "*" не может применяться к операндам типа "decimal" и "float"
Здравствуйте! Писал приложение и наткнулся на интересную ошибку (честно говоря, я не совсем понимаю...

Нарисовать в консоли домик из символов "*"
и так.... у меня задание сделать в С# в консоль ("Konsolenanwendung" на немецком, у меня прога...

Синтезатор речи "Алёна", код выводит ошибку на строке выбора
Всем привет, такая проблема. Пытаюсь поставить синтезатор речи "Алёна". SpeechSynthesizer speaker...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.