wcout函数不会打印法语字符

时间:2013-03-20 13:02:12

标签: g++ wchar-t c++

我使用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 个答案:

答案 0 :(得分: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语言环境。