Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
Arhis
0 / 0 / 0
Регистрация: 30.09.2016
Сообщений: 5
#1

Как узнать кодировку вывода в консоль во время выполнения программы?

26.11.2016, 16:44. Просмотров 586. Ответов 5
Метки нет (Все метки)

Привет всем!

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

Вопрос: есть ли возможность узнать кодировку консоли?

объясню зачем...

Вот пример кода:
предположительно вводятся русские символы

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string>
#include <Windows.h>
 
int main() 
{
    setlocale(LC_CTYPE, "Russian");
 
    std::cout << "Пожалуйста введите свое имя: ";
    std::string name;
    std::cin >> name;
 
    std::cout << "Привет ";
 
    SetConsoleCP(1251); 
    std::cout << name;
 
    SetConsoleCP(866);
    std::cout << ". Добро пожаловать!";
 
    return 0;
}
Как вы видите, каждый раз нужно переключать кодировку.
Если этого не делать выводится кракозябра при выводе введенных русских символов.
Очень неудобно каждый раз выискивать место где нужно менять кодировку и я решил написать функцию-переключатель которая будет проверять и переключать всё автоматически.
Но чтобы написать эту функцию нужно считывать текущее значение кодировки, и именно здесь возникла проблема, я не знаю как это можно реализовать...

Как можно считать значение кодировки? Заранее спасибо за ответы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2016, 16:44
Ответы с готовыми решениями:

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

Как узнать тип шаблонного класса во время выполнения программы?
Тоесть: имеем класс list&lt;int&gt; или list&lt;double&gt;, и как узнать какой это тип? Ну...

Неожиданное поведение программы: вместо вывода суммы чисел, на консоль всё время выводится ноль (цикл while)
Программа запрашивает ввод числа. После каждого введенного значения программа...

Как узнать время выполнения алгоритма
Мне нужно сравнить несколько алгоритмов сортировки. Но таким способом как у...

Как узнать скорость выполнения программы?
Должна же быть какая то функция или метод, чтобы узнать время выполнения...

5
obivan
Падаван С++
419 / 239 / 82
Регистрация: 11.11.2014
Сообщений: 845
Завершенные тесты: 2
26.11.2016, 16:48 #2
Arhis, Кракозябра потому что нужно еще писать SetConsoleOutputCP(1251)
в начале прокграммы напишите 1 раз и все

Добавлено через 1 минуту
а чтобы получать кодировки соответствующие команды GetConsoleCP, GetConsoleOutputCP
0
Arhis
0 / 0 / 0
Регистрация: 30.09.2016
Сообщений: 5
26.11.2016, 16:52  [ТС] #3
Спасибо, но слово "Привет" и значение в переменной name выводятся корректно, но все что после кракозябра

именно поэтому я использовал вынужденное переключение перед и после русского ввода

Протестируйте этот код и поймете о чем я говорю
0
obivan
Падаван С++
419 / 239 / 82
Регистрация: 11.11.2014
Сообщений: 845
Завершенные тесты: 2
26.11.2016, 17:00 #4
Не пойму в чем ваша проблемма
для чего это вообще надоArhis,
C++
1
SetConsoleCP(866);
что мешает сделать так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string>
#include <Windows.h>
 
int main() {
    setlocale(LC_ALL, "");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    std::cout << "Пожалуйста введите свое имя: ";
    std::string name;
    std::cin >> name;
 
    std::cout << "Привет ";
 
    std::cout << name;
    std::cout << ". Добро пожаловать!";
 
    std::cin.ignore();
    std::cin.ignore();
    return 0;
}
Если продолжает выводить неправильные символы зайдите в свойста консоли (правый клик по серой полоске сверху и свойста, вкладка шрифт) и выберите Consolas или точечные шрифты
0
Arhis
0 / 0 / 0
Регистрация: 30.09.2016
Сообщений: 5
26.11.2016, 18:19  [ТС] #5
Цитата Сообщение от obivan Посмотреть сообщение
Не пойму в чем ваша проблемма
для чего это вообще надоArhis,
Это всего лишь тренировка

Цитата Сообщение от obivan Посмотреть сообщение
что мешает сделать так
Мешает то что не работает должным образом, кракозябра... не полная, но частичная, часть текста отображается на русском, а часть кракозябра при выводе .

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

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

вот такой код у меня получился:

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
#include <iostream>
#include <string>
#include <Windows.h>
 
std::string get_name(void); //To get name
void rin(std::string); //for inputting of Russian text
 
int main() 
{
    setlocale(LC_CTYPE, "Russian");
 
    std::string name = get_name();
 
    std::cout << "Привет "; 
    rin(name);
    std::cout << ". Добро пожаловать!" << std::endl;
     
    return 0;
}
 
std::string get_name()
{
    std::cout << "Пожалуйста введите свое имя: ";
    std::string name;
    std::cin >> name;
    return name;
}
 
void rin(std::string text)
{
    if (GetConsoleCP() == 866){
        SetConsoleCP(1251);
        std::cout << text;
        SetConsoleCP(866);
    }
 
    else{
        SetConsoleCP(866);
        std::cout << text;
        SetConsoleCP(1251);
    }   
}
0
obivan
Падаван С++
419 / 239 / 82
Регистрация: 11.11.2014
Сообщений: 845
Завершенные тесты: 2
26.11.2016, 18:48 #6
Arhis, объясните, зачем вы каждый раз меняете кодировку на 866, при 1251 все адекватно работает, это раз, во вторых причем тут SetConsoleCP котороый влият на ВВОД а не ВЫВОД в консоль ????

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void rin(std::string text)
{
    if (GetConsoleCP() == 866){
        SetConsoleCP(1251);
        std::cout << text;
        SetConsoleCP(866);
    }
 
    else{
        SetConsoleCP(866);
        std::cout << text;
        SetConsoleCP(1251);
    }   
}
и эта функция противоречит в вашем понимании самой себе, если у нас досовская кодировка по вашему мнению, то вы зачем то меняете ввод консоли на русский язык, при это выводите строку, но если у нас иная другя кодировка то вы меняете на досовскую и зачем то возвращаете в русскую кодировку(хотя как вы говорите у вас там при русской кракозябры), честно создается впечатление, что вы не слушаете и даже не проверяете советы, и не понимаете работу стандартных а к тому же и самописных функций
0
26.11.2016, 18:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2016, 18:48

Как вы тестируете время выполнения программы?
Добрый день. Вопрос к олимпиадникам: как вы тестируете время выполнения...

Как уменьшить время выполнения программы?
Помогите пожалуйста сократить время выполнения программы. Работает за 5.008...

Как зафиксировать время начала выполнения программы
Здравствуйте) подскажите, пожалуйста, как зафиксировать время начала...


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

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

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