Setconsoleoutputcp 1251 что это
Русские символы(буквы) при вводе/выводе в консоль на C++
При изучении языка C++ и программировании под Windows довольно часто возникают вопросы по поводу отображения русских букв в консоли. Вывод и ввод русских букв сопровождается выводом и вводом каких-то кракозябр или иероглифов. В интернете можно найти довольно много советов, но большая часть советов, которые мне попались, не помогали в решении проблемы.
Возникла проблема с отображением русских букв
Если нужно быстрое решение данной проблемы, то можно сразу пролистать вниз, ибо сначала я расскажу о том, как возникла эта проблема у меня и о том, как я искал решение.
На языке C++ программирую под ОС Linux, использую компилятор GCC. С проблемой неправильного отображения русских букв я не сталкивался. В момент написания статьи я нахожусь далеко от своего компьютера, могу довольствоваться лишь скромненьким ноутбуком с установленной ОС Windows Seven. Захотелось покодить и я установил на него интегрированную среду разработки Dev-C++ 5.10(использует компилятор TDM-GCC 4.8.1 на базе GCC 4.8.1). Кстати, она уже официально не поддерживается, но существует форк Orwell Dev-C++, который обновляется по сей день. Установив, я запустил и для пробы написал простую программку, которая отображает текст «Привет, мир!». Но поздороваться она с миром так и не смогла, а лишь сказала что-то непонятное на древнеегипетском. После перелопачивания некоторых форумов и сайтов я нашел множество советов, но основная масса не способна была решить её полностью, образовывались подводные камни о которых расскажу далее.
После написания, компиляции и запуска такой программы:
Можно получить примерно такой результат
Вывод кракозябр в консоль
Сразу понятно, что на приветствие это совсем не похоже.
Последовав совету и усовершенствовав программу таким образом:
Дополнительно: можно было написать setlocale(0, «») и результат был бы аналогичным, при условии, что в настройках ОС язык системы русский.
На вывод я получил следующий результат
Отлично, подумал я. Казалось бы, что проблема решена и программа здоровается на родном языке, но вот именно здесь оказались подводные камни.
О них я узнал из обсуждения. У человека была аналогичная проблема, решенная таким образом. Но решение удовлетворяло его недолго, он сообщил, что программа при вводе данных и последующем их выводе не выводит на руском, она говорит на непонятном языке.
Коль уж так, я решил вновь внести изменения в программу, пусть она поздоровается со мной по имени.
Но в результате я получил не приветствие
Оскорбление на древнеегипетском?
Как видно, она не смогла назвать моего имени.
Поискав информацию в сети, я узнал о том, что setlocale() не работает с потокоми ввода/вывода, а то есть с cin,cout,etc. Выходит, что нужно искать альтернативные способы решения данной проблемы, которые предлагались на других сайтах.
Решение проблемы с отображением русских букв в консоли
Усовершенствовал программу таким образом
Вновь кракозябры в консоли
Снова что-то непонятное. Но решение, как оказалось, находилось очень близко. У функций SetConsoleCP() и SetConsoleOutputCP() есть небольшой недостаток — они работают только со шрифтом Lucida Console. В консоли же по умолчанию стоит шрифт Consolas, либо точечные шрифты. Следующим этапом сделать нужно вот что. Находясь в консоли нажать кнопку Cmd или нажать на значек программы в левом верхнем углу(Перед D:\… в названии), то есть вызвать контекстное меню окна. Далее нажать «Свойства».
Контекстное меню консоли
Далее появится окно с настройками, там необходимо выбрать шрифт Lucida Console.
Свойства консоли Windows
И нажать на кнопку ОК.
После такой процедуры я вновь запустил программу и…
Да! Она поздоровалась со мной по имени на русском языке.
Данный способ помог решить мне проблему с отображением русских символов в консоли Windows, надеюсь, что кому-нибудь еще он тоже поможет. Спасибо за внимание.
Для вас это может быть интересно:
Русские символы(буквы) при вводе/выводе в консоль на C++ : 28 комментариев
Блин все делаю как показано но все равно не получается в свойствах консоли установлен шрифт Lucida Console может поможете)
Пишу:
#include
#include
#include
using namespace std;
int main()
<
setlocale(LC_ALL,»Russian»);
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
cout
Проверил у себя — всё работает и отображает верно. Попробуйте набрать такую же программу, как на рисунке здесь http://nicknixer.ru/?p=349
Строчка setlocale(LC_ALL,»Russian») не нужна, без нее все работает.
В консоли 866 кодовая страница. Можно проще — Creator — Настройки — редактор — кодовая страница 866. Заработает самая первая программа.
Спасибо за 866 кодовую таблицу, все заработало.
Мучался 2 часа с выводом русских букв!
Перечитал кучу пустых советов.
Наконец-то.
Этот— самый толковый способ сделать так, чтобы все работало, и писало по русски!!
Благодарю Вас.
Я рад тому, что это помогло мне, Вам и другим людям.
Вижу, что не только в вебе проблема с отображением русских букв. PHP- программисты с вами!
Большое человеческое спасибо!
Очень помогли дельным советом. Всё работает как надо!
Спасибо!по полочкам и правильно всё разложено)
На мой взгляд, самый простой и действенный способ вывода русских букв в консоли Windows: писать исходники в ее родной кодировке, т. е. в OEM866 и проблем никаких не возникнет. Тем более, что почти все текстовые редакторы ее поддерживают. Для удобства можно установить эту кодировку по умолчанию в тот же Notepad++.
И не надо танцевать с бубном, подключать заголовки, использовать дополнительные функции, менять шрифты и т.д.
Спасибо, дай те бог здоровья!!
Благодарю за эти советы, они действующие, доходчивые. Ушла минута на то, что долго не мог сделать
Лайфхак от «Специалист»
После main
system(«chcp 1251 > nul»);
Имеется ввиду после фигурных скобок, т.е. в тело программы
Спасибо большое!Очень помогло.С начала про поток вывода узнал где то недели 2 назад, вчера заинтересовало почему поток ввода не работает. Менее минуты и вуаля. Надеюсь ругаться там не будет никто на счёт заголовочных файлов, но…ОС у всех разные, преобразователи (компиляторы) разные. Вот поэтому и советы для всех разные. Кому то кодировку сменить, а многим многим остальным дополнительные код надо писать. Может когда напишем собственную ОС(хотя кое что такое у нас было когда то давно) тогда ничего этого не надо будет. Автору статьи большое спасибо ещё раз. Русский язык стараюсь вписать куда угодно лишь бы было по русски. Надеюсь, это никого не задевает
Различие функций setlocale() и SetConsoleCP()/SetConsoleOutputCP()
Не работают функции SetConsoleCP() и SetConsoleOutputCP()
Необходимо сделать так, чтобы программа воспринимала кириллицу в потоках ввода и вывода (setlocale.
Setlocale vs. SetConsoleCP
В чём разница? Локаль определяет, в какой кодировке символы представляются в программе, а.
Вам не понять всю любовь и идеологию шиндоуз, особенно по части кодировок. Добавлено через 13 часов 1 минуту если вывести на экран через SetConsoleCP, кстати я так понимаю что кодировку консоли нужно вернуть назад? как то получается что если ничего не делать то в консоли одно, в файле другое. если все отключить то кириллица есть, но не там. но экспорт в тхт остаётся в ascii-1251 команда setlocale(LC_ALL, «Russian»); даёт плохой результат причем равный setlocale(LC_ALL, «.1251»); Данный материал не предлагает строгий алгоритм действий, а направлен на описание узловых проблем, с которыми неизбежно сталкивается разработчик локализованного консольного приложения, а также некоторые возможные пути их разрешения. Предполагается, что это позволит разработчику сформировать стратегию работы с локализованной консолью и эффективно реализовать существующие технические возможности, большая часть которых хорошо описана и здесь опущена. В общем случае функции консоли таковы: управление операционной системой и системным окружением приложений на основе применения стандартных системных устройств ввода-вывода (экран и клавиатура), использования команд операционной системы и/или собственно консоли; запуск приложений и обеспечение их доступа к стандартным потокам ввода-вывода системы, также с помощью стандартных системных устройств ввода-вывода. Отдельным видом консоли можно считать консоль отладки Visual Studio (CMD-D ). Совет 1. Выполнять разработку текстовых файлов (программных кодов, текстовых данных и др.) исключительно в кодировке UTF-8. Мир любит Юникод, а кроссплатформенность без него вообще невозможна. Совет 2. Периодически проверять кодировку, например в текстовом редакторе Notepad++. Visual Studio может сбивать кодировку, особенно при редактировании за пределами VS. Поскольку в консоли постоянно происходит передача управления от приложений к собственно командному процессору и обратно, регулярно возникает «конфликт кодировок», наглядно иллюстрируемый таблица 1 и 2, сформированных следующим образом: Команды и код приложения под катом > Echo ffffff фффффф // в командной строке PS> Echo ffffff фффффф // в PowerShell код тестового приложения: Командную часть задания все консоли локализовали практически без сбоев во всех кодировках, за исключением: в WPS неверно отображена русскоязычная часть команды во всех кодировках. Вывод тестового приложения локализован лишь в 50% испытаний, как показано в табл.2. Сoвет 3. Про PowerShell забываем раз и навсегда. Ну может не навсегда, а до следующей мажорной версии. По умолчанию Windows устанавливает для консоли кодовые страницы DOS. Чаще всего CP437, иногда CP866. Актуальные версии командной строки cmd.exe способны локализовать приложения на основе русифицированной кодовой страницы 866, но не 437, отсюда и изначальный конфликт кодировок консоли и приложения. Поэтому Отдельной опцией Visual Studio является встроенная односеансная консоль отладки, которая перехватывает команду Visual Studio на запуск приложения, запускается сама, ожидает компиляцию приложения, запускает его и отдает ему управление. Таким образом, отладочная консоль в течение всего рабочего сеанса находится под управлением приложения и возможность использования команд Windows или самой консоли, включая команду CHCP, не предусмотрена. Более того, отладочная консоль не воспринимает кодовую страницу по умолчанию, определенную в реестре, и всегда запускается в кодировке 437 или 866. Совет 6. Тестирование приложения целесообразно выполнять во внешних консолях, более дружелюбных к локализации. Ниже приведен пример вывода тестового приложения в консоль, иллюстрирующий изложенное. Метод Write получает номера текущих страниц, устанавливает новые кодовые страницы вводного и выводного потоков, выполняет чтение с консоли и записывает выводную строку, содержащий русский текст, в том числе считанный с консоли, обратно в консоль. Операция повторяется несколько раз для всех основных кодовых страниц, упомянутых ранее. приложение запущено в консоли с кодовыми страницами 1251 (строка 2); приложение меняет кодовые страницы консоли (current, setted); приложение остановлено в консоли с кодовыми страницами 1252 (строка 11, setted); Приложение адекватно локализовано только в случае совпадения текущих кодовых страниц консоли (setted 1251:1251) с начальными кодовыми страницами (строки 8 и 10). Код тестового приложения под катом Совет 7. Обязательный и повторный! Функции SetConsoleCP должны размещаться в коде до первого оператора ввода-вывода в консоль. Удалить приложение PowerShell (если установлено), сохранив Windows PowerShell; Установить в качестве кодовую страницу консоли по умолчанию CP65001 (utf-8 Unicode) или CP1251 (Windows-1251-Cyr), см. совет 5; Разработку приложений выполнять в кодировке utf-8 Unicode; Контролировать кодировку файлов исходных кодов, текстовых файлов данных, например с помощью Notepad++; Реализовать программное управление локализацией приложения в консоли, пример ниже под катом: Пример программной установки кодовой страницы и локализации приложения в консоли
получилось так что скомпилил и запустил программу со строкой
В общем, методом экспериментов можно сделать такой вывод:
1. SetConsoleOutputCP() устанавливает кодировку ВЫВОДА на консоль
2. SetConsoleCP() устанавливает кодировку ВВОДА из консоли И ИЗ РЕДАКТОРА КОДА
3. setlocale(LC_ALL,»1251″) проверяет, какая кодировка установлена сейчас, и если она не 1251, то меняет ее на 1251, а если уже 1251, то ничего не делает.
Поэтому, если уже установлена кодировка ввода ИЗ РЕДАКТОРА функцией SetConsoleCP(1251), то после нее setlocale() ничего менять не будет, и попросту выведет символы по нумерации CP866, решив, что они и так уже в windows 1251.
Если же уже выполнена функция SetConsoleOutputCP(1251), то setlocale() проверит, какая кодировка ввода установлена, и обнаружит, что кодировка ввода по прежнему CP866, поэтому она возьмет номера этих уже преобразованных символов (с помощью SetConsoleOutputCP(1251)), НО ИЗ кодовой таблицы cp866 и выведет символы с этими номерами из таблицы windows 1251.
то символика соответствует и выводу в файл ASCII
http://foxtools.ru/ASCII#1251Гарантированная локализация/русификация консоли Windows
Введение
Виды консолей
Конфликт кодировок
Табл. 1. Результат выполнения команды консоли Echo ffffff фффффф
Табл. 2. Результат запуска приложения LoggingConsole.Test
Проблемы консолей Visual Studio
Локализация отладочной консоли Visual Studio
Стратегия локализации приложения в консоли