首先,添加一些错误检查。测试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);
似乎也可以在 C 语言环境中做正确的事情。