Функция 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);
кажется, делает правильные вещи в отношении языка Си также.