Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/411: Рейтинг темы: голосов - 411, средняя оценка - 4.68
 Аватар для xlxndr
57 / 9 / 4
Регистрация: 14.06.2013
Сообщений: 129

Различие функций setlocale() и SetConsoleCP()/SetConsoleOutputCP()

20.06.2013, 01:58. Показов 87422. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вопрос состоит в следующем... Можно проверить с помощью функций GetACP(), GetOEMCP(), GetConsoleCP(), GetConsoleOutputCP(), что функция setlocale НЕ МЕНЯЕТ НИКАКИХ КОДИРОВОК в потоках ввода/вывода. Однако, если использовать функцию SetConsoleOutputCP(1251) или SetConsoleCP(1251), то после них setlocale() не работает! Особенно удивительно относительно функции SetConsoleCP(1251), она то здесь при чем?!!! Она отвечает только за ввод, но не вывод символов на экран, поэтому портить, по идее, ничего не должна! ?

листинг - 1

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <windows.h>
using namespace std;
 
main()
{
//SetConsoleCP(1251);                //пока отключили
//SetConsoleOutputCP(1251);       //пока отключили
    setlocale(LC_ALL,"Rus");          //Устанавливаем кодировку???
                                
    cout<<GetACP()<<endl;                     //будет - 1251
    cout<<GetOEMCP()<<endl;                 //будет - 866
    cout<<GetConsoleCP()<<endl;            //будет - 866
    cout<<GetConsoleOutputCP()<<endl;   //будет - 866
    
    cout<<"Однако, выводим русские буквы"<<endl;
    cin.get();
}
листинг - 2

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <windows.h>
using namespace std;
 
main()
{
   SetConsoleCP(1251);                  //ВКЛЮЧИЛИ
//SetConsoleOutputCP(1251);       //пока отключили
    setlocale(LC_ALL,"Rus");          //Устанавливаем кодировку???
                                
    cout<<GetACP()<<endl;
    cout<<GetOEMCP()<<endl;
    cout<<GetConsoleCP()<<endl;                     //поменялась
    cout<<GetConsoleOutputCP()<<endl;  
    
    cout<<"Получили крокозябры, хотя в ВЫВОДЕ на консоль НИЧЕГО не меняли"<<endl;
    cin.get();
}
листинг-3

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <windows.h>
using namespace std;
 
main()
{
    //SetConsoleCP(1251);                //пока отключили
      SetConsoleOutputCP(1251);         //ВКЛЮЧИЛИ
      setlocale(LC_ALL,"Rus");          //Устанавливаем кодировку???
                                
    cout<<GetACP()<<endl;
    cout<<GetOEMCP()<<endl;
    cout<<GetConsoleCP()<<endl;                
    cout<<GetConsoleOutputCP()<<endl;    //поменялась
    
    cout<<"Опять получили крокозябры, хотя в ВЫВОДЕ на консоль русская кодировка 1251"<<endl;
    cin.get();
}
Но вот если использовать SetConsoleOutputCP(866) или SetConsoleCP(866), то все работает нормально... Почему? Получается, если просто использовать SetConsoleOutputCP(1251) или SetConsoleCP(1251), то указываем русскую кодировку, а если setlocale, то кодировка консоли - и вывода, и что удивительно, даже ВВОДА, должно быть CP866.
Во-первых, почему CP866? Во-вторых, при чем тут функция изменения ввода SetConsoleCP(866), если мы ничего не вводим?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.06.2013, 01:58
Ответы с готовыми решениями:

Не работают функции SetConsoleCP() и SetConsoleOutputCP()
Необходимо сделать так, чтобы программа воспринимала кириллицу в потоках ввода и вывода (setlocale не подходит, так как она работает только...

Setlocale vs. SetConsoleCP
В чём разница? Локаль определяет, в какой кодировке символы представляются в программе, а SetConsoleCP устанавливает ту же характеристику...

Setconsolecp 1251, setconsoleoutputcp 1251 (Windows.h), сбиваются шрифты на других ПК
Пишу консольную прогу с помощью vs 2017 (v141), на windows 10, с версией sdk 10.0.17134.0, MFC - в статической библиотеке, тестил прогу на...

16
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
20.06.2013, 02:11
Вам не понять всю любовь и идеологию шиндоуз, особенно по части кодировок.

Если указываем кодировку 1251, то необходимо выбрать в свойствах консоли шрифт Lucida Console.
setlocale - стандартная функция, SetConsoleOutputCP() - проприетарная. Что в ней самой творится один microsoft знает, вполне вероятно, что он вставляет палки в колеса работе функции setlocale(). Не за чем вам мешать просто две эти функции. Остановитесь на чем-то одном и радуйтесь.
0
 Аватар для xlxndr
57 / 9 / 4
Регистрация: 14.06.2013
Сообщений: 129
20.06.2013, 15:33  [ТС]
Как раз и хочется понять, куда вставвляются палки... Чтобы понять механизм работы функций setlocale() и SetConsoleOutputCP()
Про Lucida Console - понятно, но это здесь не причем...

Добавлено через 17 минут
Единственный вывод, который напрашивается - это что setlocale() ПЕРЕВОДИТ текст из редактора кода в указанную кодировку перед выводом на консоль или в файл, но НЕ МЕНЯЕТ кодировку самой консоли или другого интерфейса... Поэтому при изменении кодировки консоли на 1251 текст оказывается уже переведенным в кодировку 866, и получаются крокозябры... Значит, нужно установить кодировку консоли - тоже 866... Но setlocale() работает только с выводом текста, поэтому при вводе по-любому, придется использовать SetConsoleOutputCP(1251).

Однако, тогда остается не понятным, как может портить ВЫВОД на консоль функция изменения кодировки ВВОДА - SetConsoleCP()?...

Добавлено через 13 часов 1 минуту
В общем, методом экспериментов можно сделать такой вывод:
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.
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 16:11
Цитата Сообщение от MrGluck Посмотреть сообщение
Не за чем вам мешать просто две эти функции.
Иногда приходится мешать. Например, если нужно обрабатывать ввод русских букв с помощью функций cctype.
Вот такой код, при вводе русских букв, не будет работать как надо:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <cstdlib>
#include <cctype>
#include <Windows.h>
using namespace std; 
 
int main()
{
   
   //setlocale(LC_ALL,"Rus");
   SetConsoleCP(1251);                
   SetConsoleOutputCP(1251);
 
   char ch;
   cin >> ch;
   if (isalpha((unsigned char)ch)) cout << "is alpha" << endl;
   else cout << "no alpha" << endl;
 
   system("pause");
   return 0;
}
Если раскоментировать, то будет.
2
 Аватар для Amadara
21 / 21 / 5
Регистрация: 17.12.2014
Сообщений: 322
11.12.2016, 07:35
если вывести на экран через SetConsoleCP, кстати я так понимаю что кодировку консоли нужно вернуть назад?
то символика соответствует и выводу в файл ASCII
http://foxtools.ru/ASCII#1251

как то получается что если ничего не делать то в консоли одно, в файле другое....

если все отключить то кириллица есть, но не там....но экспорт в тхт остаётся в ascii-1251
Кликните здесь для просмотра всего текста

Текущая кодовая страница: 866
Текущая кодовая страница: 866
33 ёшьтюыqwe !
34 ёшьтюыqwe "
35 ёшьтюыqwe #
36 ёшьтюыqwe $
37 ёшьтюыqwe %
38 ёшьтюыqwe &
39 ёшьтюыqwe '
40 ёшьтюыqwe (
41 ёшьтюыqwe )
42 ёшьтюыqwe *
43 ёшьтюыqwe +
44 ёшьтюыqwe ,
45 ёшьтюыqwe -
46 ёшьтюыqwe .
47 ёшьтюыqwe /
48 ёшьтюыqwe 0
49 ёшьтюыqwe 1
50 ёшьтюыqwe 2
51 ёшьтюыqwe 3
52 ёшьтюыqwe 4
53 ёшьтюыqwe 5
54 ёшьтюыqwe 6
55 ёшьтюыqwe 7
56 ёшьтюыqwe 8
57 ёшьтюыqwe 9
58 ёшьтюыqwe :
59 ёшьтюыqwe ;
60 ёшьтюыqwe <
61 ёшьтюыqwe =
62 ёшьтюыqwe >
63 ёшьтюыqwe ?
64 ёшьтюыqwe @
65 ёшьтюыqwe A
66 ёшьтюыqwe B
67 ёшьтюыqwe C
68 ёшьтюыqwe D
69 ёшьтюыqwe E
70 ёшьтюыqwe F
71 ёшьтюыqwe G
72 ёшьтюыqwe H
73 ёшьтюыqwe I
74 ёшьтюыqwe J
75 ёшьтюыqwe K
76 ёшьтюыqwe L
77 ёшьтюыqwe M
78 ёшьтюыqwe N
79 ёшьтюыqwe O
80 ёшьтюыqwe P
81 ёшьтюыqwe Q
82 ёшьтюыqwe R
83 ёшьтюыqwe S
84 ёшьтюыqwe T
85 ёшьтюыqwe U
86 ёшьтюыqwe V
87 ёшьтюыqwe W
88 ёшьтюыqwe X
89 ёшьтюыqwe Y
90 ёшьтюыqwe Z
91 ёшьтюыqwe [
92 ёшьтюыqwe \
93 ёшьтюыqwe ]
94 ёшьтюыqwe ^
95 ёшьтюыqwe _
96 ёшьтюыqwe `
97 ёшьтюыqwe a
98 ёшьтюыqwe b
99 ёшьтюыqwe c
100 ёшьтюыqwe d
101 ёшьтюыqwe e
102 ёшьтюыqwe f
103 ёшьтюыqwe g
104 ёшьтюыqwe h
105 ёшьтюыqwe i
106 ёшьтюыqwe j
107 ёшьтюыqwe k
108 ёшьтюыqwe l
109 ёшьтюыqwe m
110 ёшьтюыqwe n
111 ёшьтюыqwe o
112 ёшьтюыqwe p
113 ёшьтюыqwe q
114 ёшьтюыqwe r
115 ёшьтюыqwe s
116 ёшьтюыqwe t
117 ёшьтюыqwe u
118 ёшьтюыqwe v
119 ёшьтюыqwe w
120 ёшьтюыqwe x
121 ёшьтюыqwe y
122 ёшьтюыqwe z
123 ёшьтюыqwe {
124 ёшьтюыqwe |
125 ёшьтюыqwe }
126 ёшьтюыqwe ~
127 ёшьтюыqwe 
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


команда setlocale(LC_ALL, "Russian"); даёт плохой результат причем равный setlocale(LC_ALL, ".1251");

Кликните здесь для просмотра всего текста
Текущая кодовая страница: 866
Текущая кодовая страница: 866
33 символqwe !
34 символqwe "
35 символqwe #
36 символqwe $
37 символqwe %
38 символqwe &
39 символqwe '
40 символqwe (
41 символqwe )
42 символqwe *
43 символqwe +
44 символqwe ,
45 символqwe -
46 символqwe .
47 символqwe /
48 символqwe 0
49 символqwe 1
50 символqwe 2
51 символqwe 3
52 символqwe 4
53 символqwe 5
54 символqwe 6
55 символqwe 7
56 символqwe 8
57 символqwe 9
58 символqwe :
59 символqwe ;
60 символqwe <
61 символqwe =
62 символqwe >
63 символqwe ?
64 символqwe @
65 символqwe A
66 символqwe B
67 символqwe C
68 символqwe D
69 символqwe E
70 символqwe F
71 символqwe G
72 символqwe H
73 символqwe I
74 символqwe J
75 символqwe K
76 символqwe L
77 символqwe M
78 символqwe N
79 символqwe O
80 символqwe P
81 символqwe Q
82 символqwe R
83 символqwe S
84 символqwe T
85 символqwe U
86 символqwe V
87 символqwe W
88 символqwe X
89 символqwe Y
90 символqwe Z
91 символqwe [
92 символqwe \
93 символqwe ]
94 символqwe ^
95 символqwe _
96 символqwe `
97 символqwe a
98 символqwe b
99 символqwe c
100 символqwe d
101 символqwe e
102 символqwe f
103 символqwe g
104 символqwe h
105 символqwe i
106 символqwe j
107 символqwe k
108 символqwe l
109 символqwe m
110 символqwe n
111 символqwe o
112 символqwe p
113 символqwe q
114 символqwe r
115 символqwe s
116 символqwe t
117 символqwe u
118 символqwe v
119 символqwe w
120 символqwe x
121 символqwe y
122 символqwe z
123 символqwe {
124 символqwe |
125 символqwe }
126 символqwe ~
127 символqwe 
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 T
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 c
170 символqwe Є
171 символqwe <
172 символqwe ┐
173 символqwe -
174 символqwe R
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 А
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
Для продолжения нажмите любую клавишу . . .



C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// 004.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include <iomanip>
 
#include <Windows.h>
#include <fstream>
 
using namespace std;
 
int main()
{
    system("chcp");
    SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода (CP_UTF8)
    SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода
    
    system("chcp");
    
    ofstream fout;
    fout.open("data_types.txt", ios_base::out | ios_base::trunc);
 
    if (!fout.is_open()) // если файл небыл открыт
    {
        cout << "Файл не может быть открыт или создан\n"; // напечатать соответствующее сообщение
        return 1; // выполнить выход из программы
    }
 
 
        char k=0;
        int i=0;
 
        if (!fout.is_open()) // если файл небыл открыт
        {
            cout << "Файл не может быть открыт или создан\n"; // напечатать соответствующее сообщение
            return 1; // выполнить выход из программы
        }
 
        for (i = 33; i < 256; i++)
        {
            k = char(i);
            cout << i << "  символqwe "<< k <<endl;
            fout << i << "  символqwe " << k << endl; // запись строки в файл
        }
            
    fout.close(); // закрываем файл
 
        system("chcp");
        SetConsoleCP(866);// установка кодовой страницы в поток ввода
        SetConsoleOutputCP(866); // установка кодовой страницы в поток вывода
        system("chcp");
    system("pause");
    return 0;
}
Добавлено через 35 минут
может эти функции просто эмитируют
обычную команду CMD?
system("chcp 1251"); //#include <cstdlib> //system("**");
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.12.2016, 10:41
Цитата Сообщение от Amadara Посмотреть сообщение
может эти функции просто эмитируют
обычную команду CMD?
Скорее команда вызывает эти функции.
0
0 / 0 / 0
Регистрация: 16.10.2018
Сообщений: 3
10.11.2018, 10:58
Методом проб и ошибок созрело решение применительно на Visual Studio 2017:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main()
{
    char Name[100];
    //cout << "GetConsoleCP() =\t" << GetConsoleCP() << endl;
    //cout << "GetConsoleOutputCP() =\t" << GetConsoleOutputCP() << endl; //не используйте эти функции совместно с 
                                                                                                                      // setlocale() - конфликты какие-то
    setlocale(LC_CTYPE, "Russian"); // или "" <- пустая строка (системная кодировка)
    cout << "Введите ваше имя\t";
    cin >> Name;
    cout << "Здравствуйте, \t\t";
    SetConsoleCP(1251);
    cout << Name; 
    printf("\n");
 
system("pause");
}
На console выводится и вводится русская кодировка:
Введите ваше имя Вася_Пупкин
Здравствуйте, Вася_Пупкин
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
10.11.2018, 11:06
Разве SetConsoleCP() не до cin должна быть?
0
0 / 0 / 0
Регистрация: 16.10.2018
Сообщений: 3
10.11.2018, 13:20
SetConsoleCP(1251) действует только для вывода второй части строки, т.е стороковой переменной Name. Если её прописать до
cin, то будут выходить крякозаблы.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
10.11.2018, 14:04
SetConsoleCP() - для ввода.
0
0 / 0 / 0
Регистрация: 16.10.2018
Сообщений: 3
11.11.2018, 19:36
Точнее для вывода переменной Name на консоль без крякозябров в русской кодировке.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.11.2018, 21:24
Это обеспечивает 7-я строка.
0
7 / 7 / 0
Регистрация: 04.11.2016
Сообщений: 94
28.08.2022, 14:33
Долгое время сам мучался с выводом кириллицы в среде DevC++ Embarcadero. Перепробовал уже все варианты SetConsoleOutputCP(1251), SetConsoleCP(1251), setlocale(LC_ALL, "Russian"), setlocale(0,""), добавлял в реестре HKEY_CURRENT_USER Console 32-битный DWORD все равно при всем при этом вывод был примерно таким: Ё~~!""/. Пока не выбрал тип компилятора TDM-GCC 9.2.0 32-bit Realise, после чего стало запускаться с параметрами wscanf(L"%s", l.c_str()), wprintf(L"%s", l.c_str()) если это строки и wcout<<L"Привет!!!" если это текст
0
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
28.08.2022, 21:41
fennix,
Цитата Сообщение от fennix Посмотреть сообщение
Перепробовал уже все варианты SetConsoleOutputCP(1251), SetConsoleCP(1251), setlocale(LC_ALL, "Russian"), setlocale(0,"")
Чтобы это работало, ваш исходник должен быть в CP1251 кодировке.

Не выводятся wchar_t символы
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
28.08.2022, 23:33
Цитата Сообщение от DrOffset Посмотреть сообщение
Чтобы это работало, ваш исходник должен быть в CP1251 кодировке.
по большому счету да.
Но это еще зависит от ide
В MSVC 2015 неважна кодировка исходника при компиляции из студии.
Что логично повесить на IDE
0
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,853
Записей в блоге: 15
08.05.2023, 22:51
Мне кстати тоже, давно и с самого начала не понятно различие функций:
C
1
2
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
и
C
1
system("chcp 1251 > nul")
Понятно только, что в первом случае для вывода и ввода, нужно прописать две функции, а во втором случае только одну.
0
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
09.05.2023, 00:13
мама Стифлера, chcp - это консольная команда, которая реализована с помощью функций SetConsoleCP и SetConsoleOutputCP.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.05.2023, 00:13
Помогаю со студенческими работами здесь

{SetConsoleCP(1251); SetConsoleOutputCP(1251); сломал русс шрифт
получилось так что скомпилил и запустил программу со строкой {SetConsoleCP(1251); SetConsoleOutputCP(1251); теперь...

Непонятно различие создания функций
Несколько непонятно многообразие вариантов создания функций, например можно создать так: int oper() { . . return (); } а...

Чем отличается вызов функции setlocale(0, "") от setlocale(LC_ALL,"")?
Например printf(setlocale(0, &quot;&quot;)); cout &lt;&lt; endl; printf(setlocale(LC_ALL, &quot;&quot;)); выдают одинаковый результат (ну, на моей...

Как комбинировать setlocale(0,"") И setlocale(LC_ALL, "cp1251") ?
Мне в программе одновременно нужны символы и русский язык в консоли, и все что я знаю что если использовать только (0,&quot;&quot;) то...

SetConsoleCP
Вот есть метод SetConsoleCP(1251) Знаю, что есть кодировка 1251 и 1252. И я уверен, что их много, где можно просмотреть их список?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru