Форум программистов, компьютерный форум CyberForum.ru

Не правильно отображается текст html в консоли - C++

Восстановить пароль Регистрация
 
Matvei
0 / 0 / 0
Регистрация: 19.07.2014
Сообщений: 5
19.07.2014, 23:18     Не правильно отображается текст html в консоли #1
Здравствуйте . Я решил написать мин программку для скачивания html страницы с некого сайта, и сразу же наткнулся на подводный камень)
И так: я подключаюсь к серверу сайта, отправляю GET запрос серверу(через socket) и получал ответ - с этим всё понятно. Проблема в том что ответ от сервера записывается в буфер char ,и буквы великого и могучего занимают сразу два слота в буфере так как они в формате юникода.
Вопрос: как правильно выводить этот буфер с текстом в окно консоль?

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
 int main(int argc, char* argv[]){
      setlocale(LC_ALL, "rus");
      char buff[1024*10];
      SOCKET my_sock;
      cout << "Старт тестового клиента." << endl;
 
      // Шаг 1  инициализация библиотеки Winsock
      if(WSAStartup(0x202, (WSADATA *)&buff[0])){
        cout << "Ошибка инициализации библиотеки Winsock №" << WSAGetLastError() << endl;
        return -1;
      }
 
      // Шаг 2  создание сокета
      my_sock = socket(AF_INET, SOCK_STREAM, 0);
      if (my_sock<0)
      {
          cout<<"Ошибка создания сокета №"<<WSAGetLastError()<<endl;
          WSACleanup();
          return -1;
      }
 
      // Шаг 3  установка соединения
      // заполнение структуры sockaddr_in – указание адреса и порта сервера
      sockaddr_in dest_addr;
      dest_addr.sin_family = AF_INET;
      dest_addr.sin_port = htons(80);
 
      // преобразование IP адреса из символьного в сетевой формат
      if (inet_addr("Адрес сайта") != INADDR_NONE){
          dest_addr.sin_addr.s_addr = inet_addr("Адрес сайта");
      }
      else{
          cout << "Ошибка Преобразования IP адреса" << endl;
          WSACleanup();
          return -1;
      }
 
      // адрес сервера получен – пытаемся установить соединение 
      if (connect(my_sock, (sockaddr *)&dest_addr, sizeof(dest_addr)))
      {
         cout << "Ошибка подключения №" << WSAGetLastError() << endl;
          return -1;
          WSACleanup();
      }
      cout << "Успешное подключение\n" << endl;
          
            // Шаг 4  передача сообщений
      char ffer[1024] = "GET / HTTP/1.1\r\nHost:<Хост сайта>\r\nCache-Control: no-cache\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 YaBrowser/14.5.1847.18825 Safari/537.36\r\nAccept-Language: ru,en;q=0.8\r\n\r\n";
      send(my_sock, &ffer[0], sizeof(ffer), 0);
 
      // Шаг 5  чтение сообщений
      size_t nsize;
          nsize = recv(my_sock, &buff[0], sizeof(buff)-1, 0);
      buff[nsize] = 0;
      cout << buff << endl;
 
      system("pause");
 
 
      closesocket(my_sock);
      WSACleanup();
      return NULL;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.07.2014, 23:18     Не правильно отображается текст html в консоли
Посмотрите здесь:

Выделять текст в консоли? C++
html в консоли C++
Цветной текст в консоли C++
C++ Как правильно считать текст из файла? Весь текст, со всеми знаками, пробелами
C++ Текст в консоли
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
deniska91
54 / 3 / 3
Регистрация: 17.05.2014
Сообщений: 72
19.07.2014, 23:42     Не правильно отображается текст html в консоли #2
сделай буфер wchar_t
DrOffset
6460 / 3834 / 885
Регистрация: 30.01.2014
Сообщений: 6,629
20.07.2014, 00:06     Не правильно отображается текст html в консоли #3
Цитата Сообщение от Matvei Посмотреть сообщение
Вопрос: как правильно выводить этот буфер с текстом в окно консоль?
Если там utf8 передается, то wchar_t только все усугубит.
Консоль в какой ОС?
Если windows, то попробуй для начала переключиться командой:
chcp 65001
(нужен шрифт Lucida Console)
Matvei
0 / 0 / 0
Регистрация: 19.07.2014
Сообщений: 5
20.07.2014, 00:23  [ТС]     Не правильно отображается текст html в консоли #4
Консоль в windows 81. chcp 65001 попробовал просто каракули другими стали. Я так понимаю консоль думает что ы buff[0] и buff[1] разные буквы. Как это исправить я не знаю.
А писать что-то своё, что пройдет весь буфер и найдя два символа одной русской буквы заменит их на одну букву мне лень. Вот как-то так.
-=ЮрА=-
Заблокирован
Автор FAQ
20.07.2014, 00:56     Не правильно отображается текст html в консоли #5
Matvei, какая версия студии?Покажи часть некорректно отображённого содержимого.
Matvei
0 / 0 / 0
Регистрация: 19.07.2014
Сообщений: 5
20.07.2014, 01:13  [ТС]     Не правильно отображается текст html в консоли #6
Я использую VS free 2013.

Старт тестового клиента.
Успешное подключение

HTTP/1.1 200 OK
Server: nginx
Date: Sat, 19 Jul 2014 21:07:58 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: PHPSESSID=p5i2n92d86pmn8p7iotvifr2t0; path=/; HttpOnly
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: dle_user_id=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/;
httponly
Set-Cookie: dle_password=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/;
httponly
Set-Cookie: dle_hash=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; htt
ponly

1df8
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or
g/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>
<link media="screen" href="/templates/Anidub_online/css/smoothDivScroll.css" typ
e="text/css" rel="stylesheet" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Anidub Смотреть Аниме Онлайн Anime online беспла
тно</title>
<meta name="description" content="Anidub Аниме Онлайн здесь вы
можете смотреть аниме бесплатно РІ озвучке Р
»СЋР±РёРјС‹С… даберов." />
<meta name="keywords" content="аниме, аниме онлайн, смотре
С‚С
„«п Їа®¤®«¦Ґ*Ёп * ¦¬ЁвҐ «оЎго Є« ўЁиг . . .

Я наверно все таки буду использовать WinNet, но самому написать гораздо интереснее)
-=ЮрА=-
Заблокирован
Автор FAQ
20.07.2014, 01:21     Не правильно отображается текст html в консоли #7
Цитата Сообщение от Matvei Посмотреть сообщение
meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Anidub Смотреть Аниме Онлайн Anime online беспла
тно
</title>
<meta name="description" content="Anidub Аниме Онлайн здесь вы
можете смотреть аниме бесплатно РІ озвучке Р
»СЋР±РёРјС‹С… даберов.
" />
<meta name="keywords" content="аниме, аниме онлайн, смотре
С‚С
„«п Їа®¤®«¦Ґ*Ёп * ¦¬ЁвҐ «оЎго Є« ўЁиг . .
.
- это юникод setlocal тут не поможет, только выдёргивать из тегов текстовку и выводить уже как широкие символы.
DrOffset
6460 / 3834 / 885
Регистрация: 30.01.2014
Сообщений: 6,629
20.07.2014, 01:28     Не правильно отображается текст html в консоли #8
Matvei, в принципе похоже тебе нужен utf8 фасет, чтобы научить iostream правильно выводить твою строку. Посмотри тут.
Matvei
0 / 0 / 0
Регистрация: 19.07.2014
Сообщений: 5
20.07.2014, 02:04  [ТС]     Не правильно отображается текст html в консоли #9
Я нашел решение: сохранять массив в файл, а потом читать из него)
DrOffset
6460 / 3834 / 885
Регистрация: 30.01.2014
Сообщений: 6,629
20.07.2014, 02:46     Не правильно отображается текст html в консоли #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Matvei, вот тебе вариант для студии >= 2012. Поменял немного твой пример.
Кликните здесь для просмотра всего текста
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// ConsoleApplication8.cpp: определяет точку входа для консольного приложения.
//
#include <windows.h>
#include <winsock.h>
 
#include <iostream>
#include <locale>
#include <string>
#include <codecvt>
#include <fcntl.h>
#include <io.h>
#include <cstdio>
 
 int main(int argc, char* argv[])
 {
      _setmode(_fileno(stdout), _O_U16TEXT); 
 
      char buff[1024*10];
      SOCKET my_sock;
      std::wcout << L"Старт тестового клиента." << std::endl;
 
      // Шаг 1  инициализация библиотеки Winsock
      if(WSAStartup(0x202, (WSADATA *)&buff[0])){
        std::wcout << L"Ошибка инициализации библиотеки Winsock №" << WSAGetLastError() << std::endl;
        return -1;
      }
 
      // Шаг 2  создание сокета
      my_sock = socket(AF_INET, SOCK_STREAM, 0);
      if (my_sock<0)
      {
          std::wcout<< L"Ошибка создания сокета №"<<WSAGetLastError()<<std::endl;
          WSACleanup();
          return -1;
      }
 
      // Шаг 3  установка соединения
      // заполнение структуры sockaddr_in – указание адреса и порта сервера
      sockaddr_in dest_addr;
      dest_addr.sin_family = AF_INET;
      dest_addr.sin_port = htons(80);
 
      // преобразование IP адреса из символьного в сетевой формат
      if (inet_addr("213.180.204.3") != INADDR_NONE){
          dest_addr.sin_addr.s_addr = inet_addr("213.180.204.3");
      }
      else{
          std::wcout << L"Ошибка Преобразования IP адреса" << std::endl;
          WSACleanup();
          return -1;
      }
 
      // адрес сервера получен – пытаемся установить соединение
      if (connect(my_sock, (sockaddr *)&dest_addr, sizeof(dest_addr)) != 0)
      {
          std::wcout << L"Ошибка подключения №" << WSAGetLastError() << std::endl;
          WSACleanup();
          return -1;
      }
      std::wcout << L"Успешное подключение\n" << std::endl;
 
      // Шаг 4  передача сообщений
      char ffer[1024] = "GET / HTTP/1.1\r\nHost:<Хост сайта>\r\nCache-Control: no-cache\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 YaBrowser/14.5.1847.18825 Safari/537.36\r\nAccept-Language: ru,en;q=0.8\r\n\r\n";
      send(my_sock, &ffer[0], sizeof(ffer), 0);
 
      // Шаг 5  чтение сообщений
      size_t nsize;
      nsize = recv(my_sock, &buff[0], sizeof(buff)-1, 0);
      buff[nsize] = 0;
 
      std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> utf16conv;
 
      std::wcout << utf16conv.from_bytes(buff) << std::endl;
 
      closesocket(my_sock);
      WSACleanup();
      return NULL;
}


Добавлено через 2 минуты
Для преобразования utf8->utf16 как раз использовался фасет из моего первого поста. С некоторых пор он есть в стандартной библиотеке.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2014, 04:38     Не правильно отображается текст html в консоли
Еще ссылки по теме:

Текст с консоли в int C++
C++ Русский текст в консоли
Разноцветный текст в консоли C++

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

Или воспользуйтесь поиском по форуму:
Matvei
0 / 0 / 0
Регистрация: 19.07.2014
Сообщений: 5
20.07.2014, 04:38  [ТС]     Не правильно отображается текст html в консоли #11
Супер, большёе спасибо.
Yandex
Объявления
20.07.2014, 04:38     Не правильно отображается текст html в консоли
Ответ Создать тему
Опции темы

Текущее время: 03:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru