Функция wcout не печатает французский символ

Я использую wcin для хранения одного символа в wchar_t. Затем я пытаюсь распечатать его с помощью вызова wcout и французского символа 'é': но я не вижу его на своей консоли.

Мой компилятор - g++ 4.5.4, а моя ОС - Ubuntu 12.10 64 бит.

Вот моя попытка (wideChars.cpp):

#include <iostream>

int main(){
    using namespace std;

    wchar_t aChar;
    cout << "Enter your char : ";
    wcin >> aChar;
    wcout << L"You entered " << aChar << L" .\n";

    return 0;
}

Когда я запускаю программу:

$ ./wideChars 
Enter your char : é
You entered  .

Итак, что не так с этим кодом?

1 ответ

Решение

Сначала добавьте проверку ошибок. Проверьте, что делает wcin.good() вернуть после ввода и что делает wcout.good() вернуть после печати "Вы вошли"? Я подозреваю, что один из тех вернется false,

Каковы ваши LANG а также LC_* переменные среды установлены в?

Затем попробуйте исправить это, добавив это в верхней части вашего main() : wcin.imbue(std::locale("")); wcout.imbue(std::locale(""));

У меня под рукой сейчас нет Ubuntu, поэтому я здесь слепую и в основном догадываюсь.

ОБНОВИТЬ

Если приведенное выше предложение не помогает, попробуйте построить локаль следующим образом: imbue() эта локаль вместо

std::locale loc (
    std::locale (),
    new std::codecvt_byname<wchar_t, char, std::mbstate_t>("")));

ОБНОВЛЕНИЕ 2

Вот что у меня работает. Ключ должен установить язык C также. ИМХО, это ошибка в реализации стандартной библиотеки GNU C++. Если я не ошибаюсь, настройка std::locale::global(""); также следует установить язык библиотеки C

#include <iostream>
#include <locale>
#include <clocale>

#define DUMP(x) do { std::wcerr << #x ": " << x << "\n"; } while (0)

int main(){
    using namespace std;

    std::locale loc ("");
    std::locale::global (loc);
    DUMP(std::setlocale(LC_ALL, NULL));
    DUMP(std::setlocale(LC_ALL, ""));    
    wcin.imbue (loc);

    DUMP (wcin.good());
    wchar_t aChar = 0;
    wcin >> aChar;
    DUMP (wcin.good());
    DUMP ((int)aChar);
    wcout << L"You entered " << aChar << L" .\n";

    return 0;
}

ОБНОВЛЕНИЕ 3

Я в замешательстве, теперь я не могу воспроизвести его снова и настройки std::locale::global(loc); кажется, делает правильные вещи в отношении языка Си также.

Другие вопросы по тегам