Пусть у нас есть документ code.cpp, который был сохранен в кодировке windows-1251:
//.......header
char z = 172
std::cout<< z << std::endl; // выведет ¬
//.......
Вывело то, что мы и ожидали, тащемто. Кодировка такая и символ ему соответствует, но с другой стороны, будь мы на Windows, то консоль будет работать с кодировкой OEM (Кодировка 866), а в этой кодировке число 172 обозначает совсем другой символ, а именно м.
Как же так получается? Если воспроизводит консоль результат, то разве не должна она это в своей кодировке отобразить?
м, а байт с кодом 172. Она не перекодирует это сама, т. к. не знает ничего о кодировке, в которой этот байт интерпретируется программой. Задача конвертации лежит на рантайм-библиотеке (которая скорее всего ленится). – VladD Apr 19 '16 at 10:50