#include <iostream>
using namespace std;
int main()
{
cout << "Hello world!" << endl;
//setlocale(LC_ALL, "russian_russia");
setlocale(LC_ALL, "");
wcout << "Обанаokay" << endl;
wcout << L"Обанаokay2" << endl;
return 0;
}
MINGW + CPP + Unicode
Код:
Код:
Без установки локали вообще ничего не выводит (failbit, как я понимаю, устанавливается), а с локалью "" или "russia_RUSSIAN" крякозябры выдает. Это если исходник сохранен в UTF-8N. Иначе вовсе не компилируется с ошибкой "converting to execution character set: Illegal byte sequence".
Во вложениях скрины констант в бинарнике и результата выполнения. Без префикса L UTF-8 строка остается сама собой. С ним — становится UTF-16LE. Первое выводиться "широким" wcout по-русски и не должно, а вот почему второе не выводится как надо, не совсем понимаю, или не понимаю совсем.
Можно ли в принципе работать с "широкими" символьными константами с такой в связке так же, как и в MSVS? Если нет, то как иначе?
Например, как ведёт себя такой код:
Код:
int main()
{
setlocale(LC_ALL, "");
wcout << "Hello world!" << endl;
wcout << "Обанаokay" << endl;
wcout << L"Обанаokay2" << endl;
return 0;
}
{
setlocale(LC_ALL, "");
wcout << "Hello world!" << endl;
wcout << "Обанаokay" << endl;
wcout << L"Обанаokay2" << endl;
return 0;
}
Кстати, если не ошибаюсь, setlocale - это сишная функция. В C++ какие-то свои приёмчики были по настройке локали.
Уже, вроде, разобрался. Прочитал в нескольких местах свежие обсуждения, где говорилось, что MINGW не поддерживает C++ locale в принципе. Переписал код под Си++ locale и уменя выдает exception при imbue потока с любой локалью, кроме "C" ("" устанавливает тоже "C"). Надо другой компилятор. =)
Код:
#include <iostream>
using namespace std;
int main()
{
setlocale(LC_ALL, "");
wcout << L"Привет" << endl;
return 0;
}
using namespace std;
int main()
{
setlocale(LC_ALL, "");
wcout << L"Привет" << endl;
return 0;
}
у меня выводит "Привет". Так что, возможно, дело в MinGW или Windows, а не в компиляторе. Хотя первый пример тоже работает не так, как ожидалось.