setconsolecp 1251 что это
SetConsoleCP function
Sets the input code page used by the console associated with the calling process. A console uses its input code page to translate keyboard input into the corresponding character value.
Syntax
Parameters
wCodePageID [in]
The identifier of the code page to be set. For more information, see Remarks.
Return value
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
Remarks
A code page maps 256 character codes to individual characters. Different code pages include different special characters, typically customized for a language or a group of languages.
To find the code pages that are installed or supported by the operating system, use the EnumSystemCodePages function. The identifiers of the code pages available on the local computer are also stored in the registry under the following key:
However, it is better to use EnumSystemCodePages to enumerate code pages because the registry can differ in different versions of Windows.
To determine whether a particular code page is valid, use the IsValidCodePage function. To retrieve more information about a code page, including its name, use the GetCPInfoEx function. For a list of available code page identifiers, see Code Page Identifiers.
To determine a console’s current input code page, use the GetConsoleCP function. To set and retrieve a console’s output code page, use the SetConsoleOutputCP and GetConsoleOutputCP functions.
Различие функций setlocale() и SetConsoleCP()/SetConsoleOutputCP()
Не работают функции SetConsoleCP() и SetConsoleOutputCP()
Необходимо сделать так, чтобы программа воспринимала кириллицу в потоках ввода и вывода (setlocale.
Setlocale vs. SetConsoleCP
В чём разница? Локаль определяет, в какой кодировке символы представляются в программе, а.
Вам не понять всю любовь и идеологию шиндоуз, особенно по части кодировок. Добавлено через 13 часов 1 минуту если вывести на экран через SetConsoleCP, кстати я так понимаю что кодировку консоли нужно вернуть назад? как то получается что если ничего не делать то в консоли одно, в файле другое. если все отключить то кириллица есть, но не там. но экспорт в тхт остаётся в ascii-1251 команда setlocale(LC_ALL, «Russian»); даёт плохой результат причем равный setlocale(LC_ALL, «.1251»); При изучении языка 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, надеюсь, что кому-нибудь еще он тоже поможет. Спасибо за внимание. Блин все делаю как показано но все равно не получается в свойствах консоли установлен шрифт Lucida Console может поможете) using namespace std; int main() Проверил у себя — всё работает и отображает верно. Попробуйте набрать такую же программу, как на рисунке здесь http://nicknixer.ru/?p=349 Строчка setlocale(LC_ALL,»Russian») не нужна, без нее все работает. В консоли 866 кодовая страница. Можно проще — Creator — Настройки — редактор — кодовая страница 866. Заработает самая первая программа. Спасибо за 866 кодовую таблицу, все заработало. Мучался 2 часа с выводом русских букв! Я рад тому, что это помогло мне, Вам и другим людям. Вижу, что не только в вебе проблема с отображением русских букв. PHP- программисты с вами! Большое человеческое спасибо! Спасибо!по полочкам и правильно всё разложено) На мой взгляд, самый простой и действенный способ вывода русских букв в консоли Windows: писать исходники в ее родной кодировке, т. е. в OEM866 и проблем никаких не возникнет. Тем более, что почти все текстовые редакторы ее поддерживают. Для удобства можно установить эту кодировку по умолчанию в тот же Notepad++. Спасибо, дай те бог здоровья!! Благодарю за эти советы, они действующие, доходчивые. Ушла минута на то, что долго не мог сделать Лайфхак от «Специалист» Имеется ввиду после фигурных скобок, т.е. в тело программы Спасибо большое!Очень помогло.С начала про поток вывода узнал где то недели 2 назад, вчера заинтересовало почему поток ввода не работает. Менее минуты и вуаля. Надеюсь ругаться там не будет никто на счёт заголовочных файлов, но…ОС у всех разные, преобразователи (компиляторы) разные. Вот поэтому и советы для всех разные. Кому то кодировку сменить, а многим многим остальным дополнительные код надо писать. Может когда напишем собственную ОС(хотя кое что такое у нас было когда то давно) тогда ничего этого не надо будет. Автору статьи большое спасибо ещё раз. Русский язык стараюсь вписать куда угодно лишь бы было по русски. Надеюсь, это никого не задевает Ходят упорные слухи, что в Linux нет проблем с работой с кириллицей в консоли. Эта статья для тех, кому повезло меньше — для виндузятников. Проблема заключается в том, что когда в Microsoft придумывали Windows, то попутно придумали новую кодировку для кириллицы. Трудно сказать зачем, но придумали. А старую кодировку, которая использовалась в MS DOS, оставили. Видимо в целях обратной совместимости. И случилась жопа. С выходом новых версий Windows ситуация только ухудшилась. Т.к. консоль, уже как часть операционной системы, унаследовала кодировку кириллицы от MS DOS. В итоге сейчас для кириллицы имеем две кодировки: cp866 — старая досовская кодировка и cp1251 (она же windows-1251) — новая, от Windows. В настоящее время дело осложняется тем, что окончательно созрел Unicode, что дает еще несколько кодировок не совместимых с cp1251 и с cp866, и не совсем совместимых между собой. Но о Unicode как-нибудь в другой раз. Кстати, буковки «cp» в названии кодировки означает codepage — кодовая страница в смысле «страница кодировки символов». Итак, при написании программ строки могут встречаться в двух различных кодировках в следующих местах: Кроме того, винда при вводе и выводе кириллицы где-то в своих глубинах может делать некие преобразования кодировок, выдавая результаты, не поддающиеся расшифровке. Первое правило при работе с национальными алфавитами: все строки должны быть в единой кодировке. При несоблюдении этого правила будет невозможно сравнение и сортировка строк (а также и символов), и будет затруднён корректный ввод и вывод строк на консоль или в файл. Еще один подводный камень: В окне консоли, использующем растровые шрифты (Raster fonts), корректно отображается только кодовая страница оригинального производителя оборудования (OEM), установленная с Windows XP. Другие кодовые страницы отображаются корректно в полноэкранном режиме или в окне консоли, которое использует шрифты True Type. При этом в самой консоли отображение кириллицы при вводе (в командной строке) работает даже при использовании растровых шрифтов. Второе правило при работе с национальными алфавитами: в настройках консоли установите для вывода шрифт True Type. Сделать это можно следующим способом: И еще. Похоже, что ни Unicode, ни UTF-8, ни мультибайтовые строки в консоли напрямую не поддерживаются. По крайней мере, у меня с ними ничего путного не вышло. Далее несколько советов для борьбы с этими проблемами. Работать в «родной» для консоли кодовой странице, в cp866. Т.е. все строки с кириллицей в исходном коде программы должны быть написаны в кодировке cp866. В этой же кодировке должны быть все входные файлы для программы. И в этой же кодировке будут и все выходные файлы. Полное впечатление, что мы вернулись на 20 лет назад, в MS DOS. Если под рукой есть IDE, которая работает в консоли — особых проблем не возникнет. Если же использовать среду разработки под Windows GUI, то возникают вполне понятные сложности, поскольку IDE обычно работают в кодировке cp1251, «родной» для Windows. Кстати, как бы ни хаяли MS Visual Studio, она умеет работать с исходными текстами программ в различных кодировках, корректно их отображая в своем редакторе. Способ подходит, если необходим только вывод кириллицы на консоль, и вы работаете под Windows 7. Под Windows XP это не работает (прим. редактора — все работает). Самое простое — использовать функцию setlocale() : Функция setlocale() устанавливает или изменяет для текущей программы информацию о национальной специфике (то, что задается в апплете Region and Language в Control panel). Описание функции можно найти в MSDN. Также популярен урезанный вариант вызова: Здесь используется, что символ LC_ALL равен 0 и подразумевается, что в операционной системе установлена страна пребывания Россия (локализация самой Винды роли не играет). Но лучше все-таки использовать полную форму. Функция достаточно капризная. Это касается второго параметра. Некоторые значения, которые указаны в документации, могут на каких-то системах (компиляторах?) не работать. В качестве единственного параметра обеим функциям передается номер кодовой страницы. В нашем случае (кириллица) — это 1251. Этот способ работает и для Windows XP, и для Windows 7. Опробовано с Dev-C++ 5.6.3 (компилятор TDM-GCC 4.8.1 и MS Visual Studio 2012. Следующая тестовая программа демонстрирует вывод кириллицы на консоль, ввод кириллической строки с консоли, контрольный вывод введенной строки, сравнение введенной строки с эталонной и вывод введенной строки в файл. Исходный текст в кодировке cp1251: Эта программа также удобна для экспериментов с различными кодовыми таблицами и их сочетаниями. Для практических целей можно использовать шаблон: В Windows API есть две (а точнее, четыре пары) функции, осуществляющие перекодировку OEM ANSI (так сказано в документации). Проще говоря, в контексте рассматриваемого вопроса, это перекодировка между cp866 (OEM) и cp1251 (ANSI). «Опасные» функции без контроля длины строки: В качестве параметров получают указатели на входной и выходной буферы. Нулевой символ считается концом входной строки. «Безопасные» функции с контролем длины строки: В качестве параметров получают указатели на входной и выходной буферы и количество символов для входной строки. Нулевые символы не считаются концом строки. Преобразуется указанное количество символов. Также эти функции могут быть использованы перед выводом строки в файл или после ввода строки из файла, в случае, если кодировки не совпадают. P. S. Не судите строго — это мой первый опыт в написании статьи. Я так посмотрел, люди пишут, а чем я хуже? Тем более, что появилось чем поделиться. А оказалось, что это трудно. И написать, и ошибки проверить, и иллюстрации подготовить. На написание статьи меня сподвиг вопрос о «кракозябрах в XP». Под это дело из руин даже был извлечен старый комп с XP. И оказалось, что проблема действительно имеет место. Пришлось провести небольшое исследование, результаты которого я здесь и изложил. Также скомпилировал доступную информацию по этой теме из материалов сайта, что бы все было в одном месте. Насколько у меня это получилось — решать вам. Буду рад замечаниям и дополнениям в комментариях к статье. БлогNot. Ещё раз про setlocale и SetConsoleCP/SetConsoleOutputCP в Studio. Типовая проблема начинающих — «кракозябры» вместо кириллицы при разработке консольных приложений в MS Visual Studio. При этом, если указываем кодировку 1251, то при использовании микрософтовских функций необходимо выбрать в свойствах консоли шрифт Lucida Console, а для стандартной setlocale может и не помочь. Методом научного тыка можно сделать такие выводы: При этом, иногда мешать два способа всё же придётся. Например, если нужно обрабатывать ввод русских букв с помощью сишных функций проверки класса символов. Вот такой код, при вводе русских букв, не будет корректно проверять, введена ли буква: 13.09.2015, 14:20; рейтинг: 16552 Здравствуйте. В прошлом году взялся за изучение C++. Для этого дела использовал Microsoft Visual Studio Express. После новогодних праздников решил продолжить изучение языка (за это время успел переустановить ОС). По быстрому поставил себе компилятор g++ и IDE Geany. Для проверки корректной работы моих новых инструментов, решил набрать простую программу. И на тебе, кириллица в консоле не вывелась: В Visual Studio всё работало. В чём проблема? Вместо редактировать нажал удалить, сорри. Вообще эти два варианта справедливы для любых не входящих в стандарт функций. Отображаемый текст в консольном приложении на русском языке. Так вот присутствует безысходное состояние когда при использовании cout > и все данные записываю в текстовую переменную после её дальнейшего вывода на экран получается кракозябра, std::string name; cout > name;
получилось так что скомпилил и запустил программу со строкой
В общем, методом экспериментов можно сделать такой вывод:
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Русские символы(буквы) при вводе/выводе в консоль на C++
Возникла проблема с отображением русских букв
Решение проблемы с отображением русских букв в консоли
Для вас это может быть интересно:
Русские символы(буквы) при вводе/выводе в консоль на C++ : 28 комментариев
Пишу:
#include
#include
#include
<
setlocale(LC_ALL,»Russian»);
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
cout
Перечитал кучу пустых советов.
Наконец-то.
Этот— самый толковый способ сделать так, чтобы все работало, и писало по русски!!
Благодарю Вас.
Очень помогли дельным советом. Всё работает как надо!
И не надо танцевать с бубном, подключать заголовки, использовать дополнительные функции, менять шрифты и т.д.
После main
system(«chcp 1251 > nul»);Символы кириллицы в консоли Windows
Самый простой (и самый неудобный) способ
Вывод на консоль Windows 7
Ввод и вывод на консоль
Функции перекодировки
Setconsolecp 1251 setconsoleoutputcp 1251 что это
Ещё раз про setlocale и SetConsoleCP/SetConsoleOutputCP в Studio.
2 ответа 2
В программе присутствует ввод со стороны пользователя, всё на русском.
cout > name;
cout Голосование за лучший ответ