5

wchar_t に単一の文字を格納するために wcin を使用しています。次に、wcout 呼び出しとフランス語の文字 'é' を使用して印刷しようとしましたが、コンソールに表示されません。

私のコンパイラは g++ 4.5.4 で、OS は 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()ますか? そのうちの 1 つが戻ってくると思いfalseます。

あなたLANGLC_*環境変数は何に設定されていますか?

次に、これを の先頭に追加して、これを修正してくださいmain():wcin.imbue(std::locale("")); wcout.imbue(std::locale(""));

私は今手元に Ubuntu を持っていないので、ここで盲目的に飛んでいて、ほとんど推測しています。

アップデート

上記の提案が役に立たない場合は、imbue()代わりに this および this locale のようなロケールを構築してみてください。

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 に答える