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

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

21.10.2016, 23:13. Показов 7878. Ответов 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";
}
Миниатюры
Wcout: Вывод непонятных символов  
1
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.10.2016, 23:13
Ответы с готовыми решениями:

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

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

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

16
64 / 64 / 16
Регистрация: 07.05.2016
Сообщений: 304
21.10.2016, 23:23
sssVipersss, Возможно
C++
1
setlocale(LC_CTYPE, "");
ну и в общем поищите на тему wchar_t и кириллицы я думаю ответ прост
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
21.10.2016, 23:26
А ты к wcout локаль с кодировкой 866 прикрутил? Или как там у тебя настроено?

Добавлено через 1 минуту
C++
1
wcout.imbue(locale("rus_RUS.866"));
0
1 / 1 / 1
Регистрация: 20.01.2015
Сообщений: 31
21.10.2016, 23:47  [ТС]
В обоих случаях вывод выглядит так:
То есть, программа доходит до кириллицы, а затем поток wcout перестает что-либо выводить вообще. При этом никаких сообщений об ошибках не выводится, а программа спокойно завершается. Уже весь мозг себе сломал. Возможно стоит скинуть открываемый файл?
Миниатюры
Wcout: Вывод непонятных символов  
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.10.2016, 23:49
Цитата Сообщение от 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
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
21.10.2016, 23:49
После imbue просто русский текст в виде константы выводится?
Файл в какой кодировке? Если там utf-8, то нужен codecvt.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.10.2016, 23:50
Цитата Сообщение от nmcf Посмотреть сообщение
Файл в какой кодировке?
Это самое интересное.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
21.10.2016, 23:50
IGPIGP, это не поможет wcout. Тогда imbue с 1251 будет.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
21.10.2016, 23:57
Цитата Сообщение от sssVipersss Посмотреть сообщение
Возможно стоит скинуть открываемый файл?
Скинь.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
22.10.2016, 00:01
Альтернатива. Правда у ТС 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  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
SetConsoleCP (1251); SetConsoleOutputCP (1251);
Пробовал, не помогает. Константный русский текст выводится без проблем.
Цитата Сообщение от nmcf Посмотреть сообщение
Файл в какой кодировке? Если там utf-8, то нужен codecvt.
Поподробнее можно?
P.S. Файл прилагаю. Лежит в архиве.
Вложения
Тип файла: zip Файл.zip (14.1 Кб, 5 просмотров)
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
22.10.2016, 00:58
Цитата Сообщение от 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  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
У тебя такое компилируется?
Да, без проблем.
Объясните, что такое codecvt? Желательно с примерами.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
22.10.2016, 07:51
Лучший ответ Сообщение было отмечено 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  [ТС]
Спасибо, вам за ответ. Как только приду домой, попробую. Но выглядит, как то, что мне нужно.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
22.10.2016, 12:44
Цитата Сообщение от sssVipersss Посмотреть сообщение
Да, без проблем.
Нет, такое не может компилироваться. Там внутренние двойные кавычки должны быть экранированы. Но я вспомнил, что тут, на форуме, есть один баг: при выкладывании такого кода, экраны кавычек исчезают.
Тут выглядит так:
C++
1
wchar_t findstr[] = { L"<li class="list__item">" };
А исходный код на скрине.
Миниатюры
Wcout: Вывод непонятных символов  
1
1 / 1 / 1
Регистрация: 20.01.2015
Сообщений: 31
22.10.2016, 15:13  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
экраны кавычек исчезают.
Да, так и произошло. Извините, не обратил внимания.
Цитата Сообщение от nmcf Посмотреть сообщение
page.imbue(locale(locale(), new std::codecvt_utf8<wchar_t>));
Это действительно оказалось именно то, что мне нужно. Спасибо огромное всем, кто пытался мне помочь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.10.2016, 15:13
Помогаю со студенческими работами здесь

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

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

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

Std::wcout не выводит сообщение
Здравствуйте. Вот в таком коде : int _tmain(int argc, _TCHAR* argv) { std::vector&lt;std::string&gt; Directories; //...

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru