我使用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;
}
Run Code Online (Sandbox Code Playgroud)
当我开始编程时:
$ ./wideChars
Enter your char : é
You entered .
Run Code Online (Sandbox Code Playgroud)
那么,这段代码有什么问题?
首先,添加一些错误检查。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>("")));
Run Code Online (Sandbox Code Playgroud)
更新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;
}
Run Code Online (Sandbox Code Playgroud)
更新3
我很困惑,现在我无法再次重现它,并且设置std::locale::global(loc);似乎对 C 语言环境也做了正确的事情。