Всегда создавал сорсы в win1251, и пользовался
setlocale(LC_ALL, ".866")
и wcout` ом, для вывода кириллицы. Потом решил, что это некошерно, и стал создавать сорсы в utf8. Все было хорошо, до тех пор пока я опять не столкнулся с выводом кириллицы.
Старый вариант с setlocale уже не работал и я решил написать свою функцию для конвертации кириллических символов в читаемый на консоли вид.
void SetRusChar(char &symbol)
{
if(!symbol)
{
return;
}
/// "Разрыв" кириллицы в таблице символов ANSI
const int min=-128;
const int max=-96;
if(symbol>min&&symbol<max)
{
const int addOffset=-112;
symbol-=addOffset;
}
const int offset=16;
symbol-=offset;
}
std::string GetRusString(std::string line)
{
const char bigWaste=-48;
const char littleWaste=-47;
for(std::string::iterator i=line.begin(); i<line.end(); ++i)
{
if(*i==bigWaste||*i==littleWaste)
{
line.erase(i);
}
SetRusChar(*i);
}
return line;
}
Получилось очень убого - некоторые символы она пропускает.
Потом я понял, что без вникания в кодировки ANSI и UTF8 и их устройство здесь не обойтись.
Как сделать нормальную функцию для перевода из UTF8 в ANSI? Можно обьяснить поподробнее? Есть ли уже готовые ф-ции? В winApi например?