まず、いくつかのエラー チェックを追加します。wcin.good()
入力後に何が返され、「入力しました」の出力後に何が返されるかをテストしwcout.good()
ますか? そのうちの 1 つが戻ってくると思いfalse
ます。
あなたLANG
とLC_*
環境変数は何に設定されていますか?
次に、これを の先頭に追加して、これを修正してください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 ロケールに関しても正しいことをしているようです。