Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Дано двумерный массив целых чисел. Все нечетные элементы заданного массива заменить суммой номеров их строки и столбца http://www.cyberforum.ru/cpp-beginners/thread907371.html
решил задачу думаю правильно все сделал. Если есть гдето ошибка скажитьте)))) #include<iostream> #include <conio.h> #include <cmath> #include <iomanip> #include <time.h> using namespace...
C++ run-time check failure #3-не запускаеться программулька Простая программка, проверяю-правельная. У друзей-работает, а у меня выдает "run-time check failure #3 the variable 'c' is being used without being initialized" Что может быть это? Вижуал Студию... http://www.cyberforum.ru/cpp-beginners/thread907370.html
C++ дописать ( Из массива А удалить все элементы, которые встречаются в В ровно 2 раза. Из В переписать в С те элементы, которые совпадают с оставшимися)
нужно чтоб на экран еще выводило перед новым массивом А, числа,которые повторяются в массиве В 2 раза. и перед С тоже чтоб выводило на экран числа,которые остались в старом массиве А. само задание...
C++ Поменять местами столбцы матрицы
условие : В матрице из действительных чисел поменять местами последний столбец со столбцом, содержащим наибольшее по абсолютной величине элемент матрицы. #include <iostream> #include <stdio.h>...
C++ Перевод из Delphi в С++ http://www.cyberforum.ru/cpp-beginners/thread907318.html
Приветствую. Нужно перевести по указанному в названии темы направлении код. Премного благодарен! type TMyStrArr = array of string; function GetWordsBy1stWord(str: string):...
C++ [Linker error] undefined reference to #include<string.h> #include<stdlib.h> #include<conio.h> #include<stdio.h> #include <math.h> #include<fstream> #include<iostream> using namespace std; подробнее

Показать сообщение отдельно
xlxndr
57 / 9 / 3
Регистрация: 14.06.2013
Сообщений: 115
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
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru