Добрый день.
Итак, подведу итоги обсуждения и экспериментов.
Есть MSVC2003 и есть программа:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
std::wcout<<L"hello"<<std::endl;
std::wcout<<L"привет"<<std::endl;
return 0;
}
Она
НЕ печатает кириллицу.
Есть другая программа, в которой добавлен вызов std::wcout.imbue(std::locale("rus_rus.866"));:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
std::wcout.imbue(std::locale("rus_rus.866"));
std::wcout<<L"hello"<<std::endl;
std::wcout<<L"привет"<<std::endl;
return 0;
}
Она
ПЕЧАТАЕТ кириллицу.
Выяснилось, что в
исходнике кирилическая строка L"привет" хранится в виде кода 1251 (0xef 0xf0 0xe8 0xe2 0xe5 0xf2).
Выяснилось, что в
экзешнике кирилическая строка L"привет" хранится в виде Юникода (двухбайтовые символы 0x043f,0x0440,0x0438,0x0432,0x0435,0x0442)
Выяснилось, что директивы
#pragma setlocale( "rus_rus.866" )
#pragma setlocale( "russian" )
не помогают напечатать кириллицу. Кириллица начинает печататься только после
вызова std::wcout.imbue(std::locale("rus_rus.866"));
В связи с этим вопросы:
1. Транслятор формирует Юникодную строку "привет" из ASCIIшной строки "привет". Как транслятор понимает, что символы в исходнике из второй половины таблицы это кириллица? А не, например, греческие буквы. То есть откуда транслятор берет локаль при компиляции?
2. Если в исходнике будет несколько сообщений "привет" на разных языках, то как транслятор сформирует Юникод для каждого из них? Откуда он узнает локаль текущего сообщения?
3. Если в экзешнике уже лежит Юникодная строка, почему кириллица не печатается без явного указания локали функцией imbue? Ведь по Юникоду однозначно определяется начертание символа. И чтобы напечатать Юникод локаль не нужна.
Спасибо.