Setconsolecp 1251 что это
БлогNot. Ещё раз про setlocale и SetConsoleCP/SetConsoleOutputCP в Studio.
Ещё раз про setlocale и SetConsoleCP/SetConsoleOutputCP в Studio.
Типовая проблема начинающих — «кракозябры» вместо кириллицы при разработке консольных приложений в MS Visual Studio.
Решения известны, но с ними тоже бывают нюансы. В частности, не надо мешать в одной программе setlocale — стандартную функцию из и SetConsoleCP / SetConsoleOutputCP — пропиетарные функции от Microsoft из . Что они делают — одному микрософту известно, скорее всего, мешают работать setlocale 🙂
При этом, если указываем кодировку 1251, то при использовании микрософтовских функций необходимо выбрать в свойствах консоли шрифт Lucida Console, а для стандартной setlocale может и не помочь.
Методом научного тыка можно сделать такие выводы:
- SetConsoleOutputCP() устанавливает кодировку вывода на консоль;
- SetConsoleCP() устанавливает кодировку ввода из консоли и из редактора кода;
- setlocale(LC_ALL,».1251″) проверяет, какая кодировка установлена сейчас, и если она не 1251, то меняет ее на 1251, а если уже 1251, то ничего не делает.
Поэтому, если уже установлена кодировка ввода из редактора функцией SetConsoleCP(1251) , то после неё setlocale() ничего менять не будет, и попросту выведет символы в кодировке CP866, решив, что они и так уже в windows 1251.
Если же уже выполнена функция SetConsoleOutputCP(1251) , то setlocale() проверит, какая кодировка ввода установлена, и обнаружит, что кодировка ввода по-прежнему CP866, поэтому она возьмет номера этих уже преобразованных символов (с помощью SetConsoleOutputCP(1251) ), но из кодовой таблицы cp866, и выведет символы с этими номерами из таблицы windows 1251 🙂
При этом, иногда мешать два способа всё же придётся. Например, если нужно обрабатывать ввод русских букв с помощью сишных функций проверки класса символов.
Вот такой код, при вводе русских букв, не будет корректно проверять, введена ли буква:
#include #include #include #include using namespace std; int main() < //setlocale(LC_ALL,"Rus"); SetConsoleCP(1251); SetConsoleOutputCP(1251); char ch; cin >> ch; if (isalpha((unsigned char)ch)) cout
Если же раскомментарить строчку с setlocale , то будет.
13.09.2015, 14:20 [61579 просмотров]
В чём разница способов подключения кириллицы?
Здравствуйте! Учу С++, программирование и в целом развиваюсь в сфере IT.
Сегодня обнаружил в консольке винды команду echo, позволяющую выводить на экран некую надпись.
Решил попробовать вызвать эту команду через C++ и функцию system. Хочу заметить, что всегда использую вариант подключения кириллицы через SetConsoleCP(1251); из windows.h, как и в коде ниже.
#include "stdafx.h" #include #include using namespace std; int main()
Результатом выполнения программы оказались кракозябры, вылезающие при неподключённой кириллице.
Однако, когда я решил использовать в коде функцию setlocale, вывод на экран стал соответствовать моей цели.
#include "stdafx.h" #include using namespace std; int main()
Исходя из опытов выше, возникает вопрос: а чем различаются эти два варианта подключения кириллицы к проекту? Если что, я спрашиваю не только про результат работы, но и про сами процессы, происходящие в системе при использовании этих функций.
Заранее спасибо за ответ.
- Вопрос задан более трёх лет назад
- 4161 просмотр
Комментировать
Решения вопроса 1
Исходя из опытов выше, возникает вопрос: а чем различаются эти два варианта подключения кириллицы к проекту?
Практически всем. На самом деле, у вас есть две сущности — ваша программа и терминал. Ваша программа читает данные из stdin и пишет в stdout/stderr. Терминал же занимается тем, что отображает данные на экран. Для вас критически важно, чтобы программа передавала данные в той кодировке, в которой их ожидает увидеть терминал.
Соотвественно, когда вы вызываете SetConsoleOutputCP(1251) , вы говорите терминалу «ожидай данные в кодировке СР1251». Это плохо по нескольким причинам:
- Это чисто виндова функция. Она не переносима на другие платформы
- СР1251 — однобайтовая кодировка и ее лучше не использовать в 21 веке. Нужен юникод.
- Другие программы, работающие в этом же терминале (например echo) не знают что вы поменяли кодировку терминала. Потому вы и видите мусор.
Когда вы вызываете setlocale — вы говорите своей программе «возьми настройки кодировки из окружения и выдавай текст в ней». В результате вы подстраиваетесь под терминал и используете ту кодировку, в которой он работает. Скорее всего это будет юникод. В этом варианте все минусы превращаются в плюсы — это переносимо, это юникод, остальные программы будут работать нормально.
Кстати, вызывать setlocale с параметром Russian не совсем верно. Нужно использовать пустую строку -«». Интересно, что я уже второй раз вижу на тостере именно «Russian». Кажется, где-то по рунету гуляет неправильный пример.
Что такое SetConsoleCP(1251)
Setconsolecp 1251, setconsoleoutputcp 1251 (Windows.h), сбиваются шрифты на других ПК
Пишу консольную прогу с помощью vs 2017 (v141), на windows 10, с версией sdk 10.0.17134.0, MFC — в.
получилось так что скомпилил и запустил программу со строкой
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?
Что такое IIS и что такое PWS? Почему одно без другого не работает?
вот уже второй день пытаюсь немного разобраться в АСП. накидал небольшую тестовую страничку. но с.
Ломается кирилица в Visual Studio
Изначально проблема состояла в том, что при отладке кода в консоли вместо русскоязычных символов выводились . Решил ее путем сохранения файла в кодировке 1251, но в таком случае, после закрытия файла в Visual Studio 2019, весь русскоязычный текст в файле меняется на êëàâèàòóðå ìîáèëüíîãî Помогите грамотно решить эту проблему Данный код присутсвтует в начале main()
setlocale(LC_ALL, "ru"); SetConsoleCP(1251); SetConsoleOutputCP(1251);