5

我正在使用 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  .

那么,这段代码有什么问题?

4

1 回答 1

3

首先,添加一些错误检查。测试wcin.good()输入后wcout.good()返回什么以及“您输入”打印后返回什么?我怀疑其中一个会回来false

LANGLC_*环境变量设置为什么?

然后尝试通过在你的顶部添加这个来解决这个问题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 语言环境中做正确的事情。

于 2013-03-20T13:15:02.983 回答