Как изменить кодировку консоли visual studio
БлогNot. Ещё раз про setlocale и SetConsoleCP/SetConsoleOutputCP в Studio.
Ещё раз про setlocale и SetConsoleCP/SetConsoleOutputCP в Studio.
Типовая проблема начинающих — «кракозябры» вместо кириллицы при разработке консольных приложений в MS Visual Studio.
Решения известны, но с ними тоже бывают нюансы. В частности, не надо мешать в одной программе setlocale — стандартную функцию из <clocale> и SetConsoleCP / SetConsoleOutputCP — пропиетарные функции от Microsoft из <windows.h> . Что они делают — одному микрософту известно, скорее всего, мешают работать 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 🙂
При этом, иногда мешать два способа всё же придётся. Например, если нужно обрабатывать ввод русских букв с помощью сишных функций проверки класса символов.
Вот такой код, при вводе русских букв, не будет корректно проверять, введена ли буква:
/utf-8 (Задайте для UTF-8 исходного кода и кодировки выполнения значение).
Задает как исходную кодировку, так и кодировку выполнения в виде UTF-8 .
Синтаксис
Remarks
С помощью параметра можно /utf-8 указать как кодировку исходного кода, так и кодировку выполнения, используя UTF-8 . Он эквивалентен указанию /source-charset:utf-8 /execution-charset:utf-8 в командной строке. Любой из этих параметров также включает /validate-charset параметр по умолчанию. Список поддерживаемых идентификаторов кодовых страниц и имен наборов символов см. в разделе идентификаторы кодовых страниц.
по умолчанию Visual Studio обнаруживает метку порядка следования байтов, чтобы определить, имеет ли исходный файл формат в кодировке юникод, UTF-16 например или UTF-8 . Если метка порядка следования байтов не найдена, предполагается, что исходный файл кодируется в кодовой странице текущего пользователя, если не указана кодовая страница с помощью /utf-8 или /source-charset параметра. Visual Studio позволяет сохранить исходный код C++ в любой из нескольких кодировок символов. Сведения о кодировках исходного кода и выполнения см. в разделе наборы символов в документации по языку.
установка параметра в Visual Studio или программными средствами
Установка данного параметра компилятора в среде разработки Visual Studio
Откройте диалоговое окно Окна свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойств сборки в Visual Studio.
Выберите страницу свойств Свойства> конфигурацииC/C++>Командная строка .
В окне Дополнительные параметрыдобавьте /utf-8 параметр, чтобы указать предпочтительную кодировку.