Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
1 / 1 / 1
Регистрация: 20.01.2015
Сообщений: 31
1

Wcout: Вывод непонятных символов

21.10.2016, 23:13. Показов 5342. Ответов 16
Метки нет (Все метки)

Всем доброго времени суток. Пишу прогу, которая вычленит из html-файла определенные тэги и выведет их в консоль. В блокноте все символы отображаются нормально. Однако при попытке считать их в переменную типа wchar_t считывается что-то непонятное. Не проходит только кириллица. Пишу в Visual Studio 2015.
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
#include "stdafx.h"
#include <iostream>
#include <fstream>
 
using namespace std;
void write_tag(wifstream &p);
int main()
{
    wifstream page("body.html");
    wchar_t findstr[] = { L"<li class="list__item">" };
    int char_count = 0;
    while (!page.eof())
    {
        wchar_t get = '\0';
        page >> get;
        while (get == findstr[char_count])
        {
            page.get(get);
            if (char_count == wcslen(findstr)-1) write_tag(page);
            char_count++;
        }
        char_count = 0;
    }
    page.close();
    return 0;
}
void write_tag( wifstream &p)
{
    
    wchar_t ch='\0';
    while (ch != '>')
    {
        p >> ch;
        wcout << ch;
    }
    wcout << "\n*******************\n";
}
1
Миниатюры
Wcout: Вывод непонятных символов  
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.10.2016, 23:13
Ответы с готовыми решениями:

Вывод непонятных символов вместо русских букв
Здравствуйте, возникла такая проблема, что при выводе строки в методе Show() тот текст, который...

Вывод непонятных смайликов в консольном приложении win32 VC++
Собственно говоря проблемасовершенно не понимаю в чем тут дело, atoi работает, num обнуляется прямо...

Вывод непонятных символов
Добрый день, друзья. Так как, я изучаю java не так давно, сталкиваюсь с мелкими проблемами. При...

Вывод непонятных символов из чтения файла
Привет. Пишу программу в которой информация для структуры должна считываться и с файла .txt, но...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
16
64 / 64 / 16
Регистрация: 07.05.2016
Сообщений: 304
21.10.2016, 23:23 2
sssVipersss, Возможно
C++
1
setlocale(LC_CTYPE, "");
ну и в общем поищите на тему wchar_t и кириллицы я думаю ответ прост
0
6952 / 6004 / 2725
Регистрация: 14.04.2014
Сообщений: 25,648
21.10.2016, 23:26 3
А ты к wcout локаль с кодировкой 866 прикрутил? Или как там у тебя настроено?

Добавлено через 1 минуту
C++
1
wcout.imbue(locale("rus_RUS.866"));
0
1 / 1 / 1
Регистрация: 20.01.2015
Сообщений: 31
21.10.2016, 23:47  [ТС] 4
В обоих случаях вывод выглядит так:
То есть, программа доходит до кириллицы, а затем поток wcout перестает что-либо выводить вообще. При этом никаких сообщений об ошибках не выводится, а программа спокойно завершается. Уже весь мозг себе сломал. Возможно стоит скинуть открываемый файл?
0
Миниатюры
Wcout: Вывод непонятных символов  
Комп_Оратор)
Эксперт по математике/физике
8662 / 4375 / 595
Регистрация: 04.12.2011
Сообщений: 13,087
Записей в блоге: 16
21.10.2016, 23:49 5
Цитата Сообщение от nmcf Посмотреть сообщение
А ты к wcout локаль с кодировкой 866 прикрутил?
Вот так может:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <windows.h>
using namespace std; 
int main(int argc, char* argv[])
{
SetConsoleCP (1251); SetConsoleOutputCP (1251);
 
wcout<<"Hello'ствуй world! \nКирилице -УРА! \nИ каждый word теперь, \nKак Здрастуй мая ра!"<<endl;
cin.ignore(cin.rdbuf()->in_avail());
cin.clear();
cin.get();
return 0;    
}
?
0
6952 / 6004 / 2725
Регистрация: 14.04.2014
Сообщений: 25,648
21.10.2016, 23:49 6
После imbue просто русский текст в виде константы выводится?
Файл в какой кодировке? Если там utf-8, то нужен codecvt.
1
Комп_Оратор)
Эксперт по математике/физике
8662 / 4375 / 595
Регистрация: 04.12.2011
Сообщений: 13,087
Записей в блоге: 16
21.10.2016, 23:50 7
Цитата Сообщение от nmcf Посмотреть сообщение
Файл в какой кодировке?
Это самое интересное.
0
6952 / 6004 / 2725
Регистрация: 14.04.2014
Сообщений: 25,648
21.10.2016, 23:50 8
IGPIGP, это не поможет wcout. Тогда imbue с 1251 будет.
0
nd2
3408 / 2789 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
21.10.2016, 23:57 9
Цитата Сообщение от sssVipersss Посмотреть сообщение
Возможно стоит скинуть открываемый файл?
Скинь.
0
Комп_Оратор)
Эксперт по математике/физике
8662 / 4375 / 595
Регистрация: 04.12.2011
Сообщений: 13,087
Записей в блоге: 16
22.10.2016, 00:01 10
Альтернатива. Правда у ТС Windows и её средств должно хватать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
//#include <windows.h>
using namespace std; 
int main(int argc, char* argv[])
{
//SetConsoleCP (1251); SetConsoleOutputCP (1251);
std::locale current_locale("");
std::locale::global(current_locale);
std::ios::sync_with_stdio(false);
wcout<<L"Hello'ствуй world! \nКирилице -УРА! \nИ каждый word теперь, \nKак Здрастуй мая ра!"<<endl;
system("pause");
return 0;    
}
а так-то надо бы как-то wchar_t и wsting юзать?
0
1 / 1 / 1
Регистрация: 20.01.2015
Сообщений: 31
22.10.2016, 00:38  [ТС] 11
Цитата Сообщение от IGPIGP Посмотреть сообщение
SetConsoleCP (1251); SetConsoleOutputCP (1251);
Пробовал, не помогает. Константный русский текст выводится без проблем.
Цитата Сообщение от nmcf Посмотреть сообщение
Файл в какой кодировке? Если там utf-8, то нужен codecvt.
Поподробнее можно?
P.S. Файл прилагаю. Лежит в архиве.
0
Вложения
Тип файла: zip Файл.zip (14.1 Кб, 5 просмотров)
nd2
3408 / 2789 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
22.10.2016, 00:58 12
Цитата Сообщение от sssVipersss Посмотреть сообщение
wchar_t findstr[] = { L"<li class="list__item">" };
У тебя такое компилируется?

Добавлено через 14 минут
Файл в UTF-8.
0
1 / 1 / 1
Регистрация: 20.01.2015
Сообщений: 31
22.10.2016, 06:49  [ТС] 13
Цитата Сообщение от nd2 Посмотреть сообщение
У тебя такое компилируется?
Да, без проблем.
Объясните, что такое codecvt? Желательно с примерами.
0
6952 / 6004 / 2725
Регистрация: 14.04.2014
Сообщений: 25,648
22.10.2016, 07:51 14
Лучший ответ Сообщение было отмечено sssVipersss как решение

Решение

C++
1
2
3
4
5
6
7
#include <locale>
#include <codecvt>
//...
wcout.imbue(locale("rus_RUS.866"));
//...
std::wifstream page(L"body.html");
page.imbue(locale(locale(), new std::codecvt_utf8<wchar_t>));
Строки и символы с L должны быть:
C++
1
while (ch != L'>')
3
1 / 1 / 1
Регистрация: 20.01.2015
Сообщений: 31
22.10.2016, 09:11  [ТС] 15
Спасибо, вам за ответ. Как только приду домой, попробую. Но выглядит, как то, что мне нужно.
0
nd2
3408 / 2789 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
22.10.2016, 12:44 16
Цитата Сообщение от sssVipersss Посмотреть сообщение
Да, без проблем.
Нет, такое не может компилироваться. Там внутренние двойные кавычки должны быть экранированы. Но я вспомнил, что тут, на форуме, есть один баг: при выкладывании такого кода, экраны кавычек исчезают.
Тут выглядит так:
C++
1
wchar_t findstr[] = { L"<li class="list__item">" };
А исходный код на скрине.
1
Миниатюры
Wcout: Вывод непонятных символов  
1 / 1 / 1
Регистрация: 20.01.2015
Сообщений: 31
22.10.2016, 15:13  [ТС] 17
Цитата Сообщение от nd2 Посмотреть сообщение
экраны кавычек исчезают.
Да, так и произошло. Извините, не обратил внимания.
Цитата Сообщение от nmcf Посмотреть сообщение
page.imbue(locale(locale(), new std::codecvt_utf8<wchar_t>));
Это действительно оказалось именно то, что мне нужно. Спасибо огромное всем, кто пытался мне помочь.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.10.2016, 15:13

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

Вместо ожидаемого массива выводит набор символов непонятных
Здравствуйте, у меня такая проблема, есть условия, отсортировать слова в строке по количеству...

Использование wcout
В чем ошибка? Компиляция прошла без проблем. В командной строке пишет просто &quot;Для продолжения...

Std::wcout не выводит сообщение
Здравствуйте. Вот в таком коде : int _tmain(int argc, _TCHAR* argv) {...

wcout, wfstream в Code Blocks
Не пойму, почему компилятор не определяет wcout, wfstream. #include &lt;iostream&gt;, #include &lt;fstream&gt;,...


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

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

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