тысяча третий раз про Юникод
От: pepsicoca  
Дата: 14.10.09 08:18
Оценка:
Добрый день.

Итак, подведу итоги обсуждения и экспериментов.

Есть 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? Ведь по Юникоду однозначно определяется начертание символа. И чтобы напечатать Юникод локаль не нужна.

Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.