Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

MINGW + CPP + Unicode

287
21 июля 2010 года
Shiizoo
958 / / 14.03.2004
Пытаюсь разобраться, как в си++ работать с юникодом в консольном приложении. Ось winxp, IDE C::B, компилятор GCC 4.4.1 из MINGW.

Код:
Код:
#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;
}


Без установки локали вообще ничего не выводит (failbit, как я понимаю, устанавливается), а с локалью "" или "russia_RUSSIAN" крякозябры выдает. Это если исходник сохранен в UTF-8N. Иначе вовсе не компилируется с ошибкой "converting to execution character set: Illegal byte sequence".

Во вложениях скрины констант в бинарнике и результата выполнения. Без префикса L UTF-8 строка остается сама собой. С ним — становится UTF-16LE. Первое выводиться "широким" wcout по-русски и не должно, а вот почему второе не выводится как надо, не совсем понимаю, или не понимаю совсем.

Можно ли в принципе работать с "широкими" символьными константами с такой в связке так же, как и в MSVS? Если нет, то как иначе?
87
21 июля 2010 года
Kogrom
2.7K / / 02.02.2008
У MinGW всегда были такие проблемы. Хотя по слухам, в новых версиях должны были поправить. Не пробовали не перемешивать cout и wcout?

Например, как ведёт себя такой код:

 
Код:
int main()
{
    setlocale(LC_ALL, "");
    wcout << "Hello world!" << endl;
    wcout << "Обанаokay" << endl;
    wcout << L"Обанаokay2" << endl;
    return 0;
}

Кстати, если не ошибаюсь, setlocale - это сишная функция. В C++ какие-то свои приёмчики были по настройке локали.
287
21 июля 2010 года
Shiizoo
958 / / 14.03.2004
Уже, вроде, разобрался. Прочитал в нескольких местах свежие обсуждения, где говорилось, что MINGW не поддерживает C++ locale в принципе. Переписал код под Си++ locale и уменя выдает exception при imbue потока с любой локалью, кроме "C" ("" устанавливает тоже "C"). Надо другой компилятор. =)
87
21 июля 2010 года
Kogrom
2.7K / / 02.02.2008
В Ubuntu 9.10, gcc 4.4.1 кодом:

 
Код:
#include <iostream>

using namespace std;

int main()
{
    setlocale(LC_ALL, "");
    wcout << L"Привет" << endl;
    return 0;
}

у меня выводит "Привет". Так что, возможно, дело в MinGW или Windows, а не в компиляторе. Хотя первый пример тоже работает не так, как ожидалось.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог