- Не работают функции SetConsoleCP() и SetConsoleOutputCP()
- Setconsolecp 1251 setconsoleoutputcp 1251 не работает
- Ещё раз про setlocale и SetConsoleCP/SetConsoleOutputCP в Studio.
- Русские символы(буквы) при вводе/выводе в консоль на C++
- Возникла проблема с отображением русских букв
- Решение проблемы с отображением русских букв в консоли
- Для вас это может быть интересно:
- Русские символы(буквы) при вводе/выводе в консоль на C++ : 28 комментариев
- Различие функций setlocale() и SetConsoleCP()/SetConsoleOutputCP()
Не работают функции SetConsoleCP() и SetConsoleOutputCP()
Необходимо сделать так, чтобы программа воспринимала кириллицу в потоках ввода и вывода (setlocale не подходит, так как она работает только с потоком вывода). Решил использовать функции SetConsoleCP(1251) и SetConsoleOutputCP(1251), подключил библиотеки #include . Компилятор не ругается, но в итоге в программа все равно не воспринимает кириллицу — крякозябрики показывает.
В чем ошибка, и есть ли простые замены функциям SetConsoleCP() и SetConsoleOutputCP() ? Работаю в CodeBlocks. Возможно, где-то в настройках нужно включить поддержку этих функций?
Различие функций setlocale() и SetConsoleCP()/SetConsoleOutputCP()
Вопрос состоит в следующем. Можно проверить с помощью функций GetACP(), GetOEMCP().
Пишу консольную прогу с помощью vs 2017 (v141), на windows 10, с версией sdk 10.0.17134.0, MFC — в.
SetConsoleCP Источник БлогNot. Ещё раз про setlocale и SetConsoleCP/SetConsoleOutputCP в Studio. Типовая проблема начинающих — «кракозябры» вместо кириллицы при разработке консольных приложений в MS Visual Studio. Решения известны, но с ними тоже бывают нюансы. В частности, не надо мешать в одной программе setlocale — стандартную функцию из и SetConsoleCP / SetConsoleOutputCP — пропиетарные функции от Microsoft из . Что они делают — одному микрософту известно, скорее всего, мешают работать setlocale 🙂 При этом, если указываем кодировку 1251, то при использовании микрософтовских функций необходимо выбрать в свойствах консоли шрифт Lucida Console, а для стандартной setlocale может и не помочь. Методом научного тыка можно сделать такие выводы: Поэтому, если уже установлена кодировка ввода из редактора функцией SetConsoleCP(1251) , то после неё setlocale() ничего менять не будет, и попросту выведет символы в кодировке CP866, решив, что они и так уже в windows 1251. Если же уже выполнена функция SetConsoleOutputCP(1251) , то setlocale() проверит, какая кодировка ввода установлена, и обнаружит, что кодировка ввода по-прежнему CP866, поэтому она возьмет номера этих уже преобразованных символов (с помощью SetConsoleOutputCP(1251) ), но из кодовой таблицы cp866, и выведет символы с этими номерами из таблицы windows 1251 🙂 При этом, иногда мешать два способа всё же придётся. Например, если нужно обрабатывать ввод русских букв с помощью сишных функций проверки класса символов. Вот такой код, при вводе русских букв, не будет корректно проверять, введена ли буква: Если же раскомментарить строчку с setlocale , то будет. Источник При изучении языка C++ и программировании под Windows довольно часто возникают вопросы по поводу отображения русских букв в консоли. Вывод и ввод русских букв сопровождается выводом и вводом каких-то кракозябр или иероглифов. В интернете можно найти довольно много советов, но большая часть советов, которые мне попались, не помогали в решении проблемы. Если нужно быстрое решение данной проблемы, то можно сразу пролистать вниз, ибо сначала я расскажу о том, как возникла эта проблема у меня и о том, как я искал решение. На языке C++ программирую под ОС Linux, использую компилятор GCC. С проблемой неправильного отображения русских букв я не сталкивался. В момент написания статьи я нахожусь далеко от своего компьютера, могу довольствоваться лишь скромненьким ноутбуком с установленной ОС Windows Seven. Захотелось покодить и я установил на него интегрированную среду разработки Dev-C++ 5.10(использует компилятор TDM-GCC 4.8.1 на базе GCC 4.8.1). Кстати, она уже официально не поддерживается, но существует форк Orwell Dev-C++, который обновляется по сей день. Установив, я запустил и для пробы написал простую программку, которая отображает текст «Привет, мир!». Но поздороваться она с миром так и не смогла, а лишь сказала что-то непонятное на древнеегипетском. После перелопачивания некоторых форумов и сайтов я нашел множество советов, но основная масса не способна была решить её полностью, образовывались подводные камни о которых расскажу далее. После написания, компиляции и запуска такой программы: Можно получить примерно такой результат Вывод кракозябр в консоль Сразу понятно, что на приветствие это совсем не похоже. После прочтения кучи советов стало понятно, что большая часть советов предлагала решить проблему функцией setlocale(), которая находится в заголовочном файле . Последовав совету и усовершенствовав программу таким образом: Дополнительно: можно было написать setlocale(0, «») и результат был бы аналогичным, при условии, что в настройках ОС язык системы русский. На вывод я получил следующий результат Отлично, подумал я. Казалось бы, что проблема решена и программа здоровается на родном языке, но вот именно здесь оказались подводные камни. О них я узнал из обсуждения. У человека была аналогичная проблема, решенная таким образом. Но решение удовлетворяло его недолго, он сообщил, что программа при вводе данных и последующем их выводе не выводит на руском, она говорит на непонятном языке. Коль уж так, я решил вновь внести изменения в программу, пусть она поздоровается со мной по имени. Но в результате я получил не приветствие Оскорбление на древнеегипетском? Как видно, она не смогла назвать моего имени. Поискав информацию в сети, я узнал о том, что setlocale() не работает с потокоми ввода/вывода, а то есть с cin,cout,etc. Выходит, что нужно искать альтернативные способы решения данной проблемы, которые предлагались на других сайтах. По-другому решить проблему можно было воспользовавшись функциями SetConsoleCP() и SetConsoleOutputCP() с аргуменом 1251 в обеих. Эти функции требуют подключения заголовка , практически в каждом компиляторе под Windows он имеется, проблем не будет. Усовершенствовал программу таким образом На вывод получил Вновь кракозябры в консоли Снова что-то непонятное. Но решение, как оказалось, находилось очень близко. У функций 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++. Спасибо, дай те бог здоровья!! Благодарю за эти советы, они действующие, доходчивые. Ушла минута на то, что долго не мог сделать 6 часов искал ответ!Спасибо ! Лайфхак от «Специалист» Имеется ввиду после фигурных скобок, т.е. в тело программы Вообще-то setlocale() и всё вокруг неё касается преобразований WCHAR -> BYTE -> WCHAR у CRT функций (ну например если выводить тот-же самый «Привет мир» вот так: Спасибо большое!Очень помогло.С начала про поток вывода узнал где то недели 2 назад, вчера заинтересовало почему поток ввода не работает. Менее минуты и вуаля. Надеюсь ругаться там не будет никто на счёт заголовочных файлов, но…ОС у всех разные, преобразователи (компиляторы) разные. Вот поэтому и советы для всех разные. Кому то кодировку сменить, а многим многим остальным дополнительные код надо писать. Может когда напишем собственную ОС(хотя кое что такое у нас было когда то давно) тогда ничего этого не надо будет. Автору статьи большое спасибо ещё раз. Русский язык стараюсь вписать куда угодно лишь бы было по русски. Надеюсь, это никого не задевает Источник Вопрос состоит в следующем. Можно проверить с помощью функций GetACP(), GetOEMCP(), GetConsoleCP(), GetConsoleOutputCP(), что функция setlocale НЕ МЕНЯЕТ НИКАКИХ КОДИРОВОК в потоках ввода/вывода. Однако, если использовать функцию SetConsoleOutputCP(1251) или SetConsoleCP(1251), то после них setlocale() не работает! Особенно удивительно относительно функции SetConsoleCP(1251), она то здесь при чем. Она отвечает только за ввод, но не вывод символов на экран, поэтому портить, по идее, ничего не должна! ? Помощь в написании контрольных, курсовых и дипломных работ здесь. Не работают функции SetConsoleCP() и SetConsoleOutputCP() Setlocale vs. SetConsoleCP Вам не понять всю любовь и идеологию шиндоуз, особенно по части кодировок. Если указываем кодировку 1251, то необходимо выбрать в свойствах консоли шрифт Lucida Console. Как раз и хочется понять, куда вставвляются палки. Чтобы понять механизм работы функций setlocale() и SetConsoleOutputCP() Добавлено через 17 минут Однако, тогда остается не понятным, как может портить ВЫВОД на консоль функция изменения кодировки ВВОДА — SetConsoleCP(). Добавлено через 13 часов 1 минуту если вывести на экран через SetConsoleCP, кстати я так понимаю что кодировку консоли нужно вернуть назад? как то получается что если ничего не делать то в консоли одно, в файле другое. если все отключить то кириллица есть, но не там. но экспорт в тхт остаётся в ascii-1251 127 ёшьтюыqwe команда setlocale(LC_ALL, «Russian»); даёт плохой результат причем равный setlocale(LC_ALL, «.1251»); 127 символqwe Источник
получилось так что скомпилил и запустил программу со строкой
Вот есть метод SetConsoleCP(1251) Знаю, что есть кодировка 1251 и 1252. И я уверен, что их.Setconsolecp 1251 setconsoleoutputcp 1251 не работает
Ещё раз про setlocale и SetConsoleCP/SetConsoleOutputCP в Studio.
Русские символы(буквы) при вводе/выводе в консоль на C++
Возникла проблема с отображением русских букв
Решение проблемы с отображением русских букв в консоли
Для вас это может быть интересно:
Русские символы(буквы) при вводе/выводе в консоль на C++ : 28 комментариев
Пишу:
#include
#include
#include
<
setlocale(LC_ALL,»Russian»);
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
cout
Перечитал кучу пустых советов.
Наконец-то.
Этот— самый толковый способ сделать так, чтобы все работало, и писало по русски!!
Благодарю Вас.
Очень помогли дельным советом. Всё работает как надо!
И не надо танцевать с бубном, подключать заголовки, использовать дополнительные функции, менять шрифты и т.д.
После main
system(«chcp 1251 > nul»);
…
setlocale( LC_ALL, «.OCP» );
wprintf(L»Привет мир!»);
…
То будет уже профит.
В свою очередь SetConsoleOutputCP() нужна примерно для того-же — на Винде с чужой кодировкой выводить юникодные строки кирилицей.
ну а так Taras Lavrov верно указал как это для неюникодных программ делается.Различие функций setlocale() и SetConsoleCP()/SetConsoleOutputCP()
Необходимо сделать так, чтобы программа воспринимала кириллицу в потоках ввода и вывода (setlocale.
В чём разница? Локаль определяет, в какой кодировке символы представляются в программе, а.
Пишу консольную прогу с помощью vs 2017 (v141), на windows 10, с версией sdk 10.0.17134.0, MFC — в.
получилось так что скомпилил и запустил программу со строкой
setlocale — стандартная функция, SetConsoleOutputCP() — проприетарная. Что в ней самой творится один microsoft знает, вполне вероятно, что он вставляет палки в колеса работе функции setlocale(). Не за чем вам мешать просто две эти функции. Остановитесь на чем-то одном и радуйтесь.
Про Lucida Console — понятно, но это здесь не причем.
Единственный вывод, который напрашивается — это что setlocale() ПЕРЕВОДИТ текст из редактора кода в указанную кодировку перед выводом на консоль или в файл, но НЕ МЕНЯЕТ кодировку самой консоли или другого интерфейса. Поэтому при изменении кодировки консоли на 1251 текст оказывается уже переведенным в кодировку 866, и получаются крокозябры. Значит, нужно установить кодировку консоли — тоже 866. Но setlocale() работает только с выводом текста, поэтому при вводе по-любому, придется использовать SetConsoleOutputCP(1251).
В общем, методом экспериментов можно сделать такой вывод:
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
128 ёшьтюыqwe А
129 ёшьтюыqwe Б
130 ёшьтюыqwe В
131 ёшьтюыqwe Г
132 ёшьтюыqwe Д
133 ёшьтюыqwe Е
134 ёшьтюыqwe Ж
135 ёшьтюыqwe З
136 ёшьтюыqwe И
137 ёшьтюыqwe Й
138 ёшьтюыqwe К
139 ёшьтюыqwe Л
140 ёшьтюыqwe М
141 ёшьтюыqwe Н
142 ёшьтюыqwe О
143 ёшьтюыqwe П
144 ёшьтюыqwe Р
145 ёшьтюыqwe С
146 ёшьтюыqwe Т
147 ёшьтюыqwe У
148 ёшьтюыqwe Ф
149 ёшьтюыqwe Х
150 ёшьтюыqwe Ц
151 ёшьтюыqwe Ч
152 ёшьтюыqwe Ш
153 ёшьтюыqwe Щ
154 ёшьтюыqwe Ъ
155 ёшьтюыqwe Ы
156 ёшьтюыqwe Ь
157 ёшьтюыqwe Э
158 ёшьтюыqwe Ю
159 ёшьтюыqwe Я
160 ёшьтюыqwe а
161 ёшьтюыqwe б
162 ёшьтюыqwe в
163 ёшьтюыqwe г
164 ёшьтюыqwe д
165 ёшьтюыqwe е
166 ёшьтюыqwe ж
167 ёшьтюыqwe з
168 ёшьтюыqwe и
169 ёшьтюыqwe й
170 ёшьтюыqwe к
171 ёшьтюыqwe л
172 ёшьтюыqwe м
173 ёшьтюыqwe н
174 ёшьтюыqwe о
175 ёшьтюыqwe п
176 ёшьтюыqwe —
177 ёшьтюыqwe —
178 ёшьтюыqwe —
179 ёшьтюыqwe ¦
180 ёшьтюыqwe +
181 ёшьтюыqwe ¦
182 ёшьтюыqwe ¦
183 ёшьтюыqwe ¬
184 ёшьтюыqwe ¬
185 ёшьтюыqwe ¦
186 ёшьтюыqwe ¦
187 ёшьтюыqwe ¬
188 ёшьтюыqwe —
189 ёшьтюыqwe —
190 ёшьтюыqwe —
191 ёшьтюыqwe ¬
192 ёшьтюыqwe L
193 ёшьтюыqwe +
194 ёшьтюыqwe T
195 ёшьтюыqwe +
196 ёшьтюыqwe —
197 ёшьтюыqwe +
198 ёшьтюыqwe ¦
199 ёшьтюыqwe ¦
200 ёшьтюыqwe L
201 ёшьтюыqwe г
202 ёшьтюыqwe ¦
203 ёшьтюыqwe T
204 ёшьтюыqwe ¦
205 ёшьтюыqwe =
206 ёшьтюыqwe +
207 ёшьтюыqwe ¦
208 ёшьтюыqwe ¦
209 ёшьтюыqwe T
210 ёшьтюыqwe T
211 ёшьтюыqwe L
212 ёшьтюыqwe L
213 ёшьтюыqwe —
214 ёшьтюыqwe г
215 ёшьтюыqwe +
216 ёшьтюыqwe +
217 ёшьтюыqwe —
218 ёшьтюыqwe —
219 ёшьтюыqwe —
220 ёшьтюыqwe —
221 ёшьтюыqwe ¦
222 ёшьтюыqwe ¦
223 ёшьтюыqwe —
224 ёшьтюыqwe р
225 ёшьтюыqwe с
226 ёшьтюыqwe т
227 ёшьтюыqwe у
228 ёшьтюыqwe ф
229 ёшьтюыqwe х
230 ёшьтюыqwe ц
231 ёшьтюыqwe ч
232 ёшьтюыqwe ш
233 ёшьтюыqwe щ
234 ёшьтюыqwe ъ
235 ёшьтюыqwe ы
236 ёшьтюыqwe ь
237 ёшьтюыqwe э
238 ёшьтюыqwe ю
239 ёшьтюыqwe я
240 ёшьтюыqwe Ё
241 ёшьтюыqwe ё
242 ёшьтюыqwe Є
243 ёшьтюыqwe є
244 ёшьтюыqwe Ї
245 ёшьтюыqwe ї
246 ёшьтюыqwe Ў
247 ёшьтюыqwe ў
248 ёшьтюыqwe °
249 ёшьтюыqwe •
250 ёшьтюыqwe ·
251 ёшьтюыqwe v
252 ёшьтюыqwe №
253 ёшьтюыqwe ¤
254 ёшьтюыqwe ¦
255 ёшьтюыqwe *
Текущая кодовая страница: 866
128 символqwe ?
129 символqwe ?
130 символqwe ‘
131 символqwe ?
132 символqwe »
133 символqwe :
134 символqwe ┼
135 символqwe ╪
136 символqwe ?
137 символqwe %
138 символqwe ?
139 символqwe
156 символqwe ?
157 символqwe ?
158 символqwe ?
159 символqwe ?
160 символqwe *
161 символqwe Ў
162 символqwe ў
163 символqwe ?
164 символqwe ¤
165 символqwe ?
166 символqwe │
167 символqwe
168 символqwe Ё
169 символqwe c
170 символqwe Є
171 символqwe
188 символqwe ?
189 символqwe ?
190 символqwe ?
191 символqwe ї
192 символqwe А
193 символqwe Б
194 символqwe В
195 символqwe Г
196 символqwe Д
197 символqwe Е
198 символqwe Ж
199 символqwe З
200 символqwe И
201 символqwe Й
202 символqwe К
203 символqwe Л
204 символqwe М
205 символqwe Н
206 символqwe О
207 символqwe П
208 символqwe Р
209 символqwe С
210 символqwe Т
211 символqwe У
212 символqwe Ф
213 символqwe Х
214 символqwe Ц
215 символqwe Ч
216 символqwe Ш
217 символqwe Щ
218 символqwe Ъ
219 символqwe Ы
220 символqwe Ь
221 символqwe Э
222 символqwe Ю
223 символqwe Я
224 символqwe а
225 символqwe б
226 символqwe в
227 символqwe г
228 символqwe д
229 символqwe е
230 символqwe ж
231 символqwe з
232 символqwe и
233 символqwe й
234 символqwe к
235 символqwe л
236 символqwe м
237 символqwe н
238 символqwe о
239 символqwe п
240 символqwe р
241 символqwe с
242 символqwe т
243 символqwe у
244 символqwe ф
245 символqwe х
246 символqwe ц
247 символqwe ч
248 символqwe ш
249 символqwe щ
250 символqwe ъ
251 символqwe ы
252 символqwe ь
253 символqwe э
254 символqwe ю
255 символqwe я
Текущая кодовая страница: 866
Для продолжения нажмите любую клавишу . . .