wchar_t と utf8 の間で文字列を変換するいくつかの関数をテストしているときに、Visual C++ Express 2008 で次の奇妙な結果に遭遇しました。
std::wcout << L"élève" << std::endl;
「ÚlÞve:」が出力されますが、これは明らかに期待どおりではありません。
これは明らかにバグです。どうしてですか?そのような「機能」をどのように扱うと思いますか?
C++ コンパイラは、コード ファイルで Unicode をサポートしていません。代わりに、これらの文字をエスケープされたバージョンに置き換える必要があります。
これを試して:
std::wcout << L"\x00E9l\x00E8ve" << std::endl;
また、コンソールも Unicode をサポートしている必要があります。
アップデート:
コンソールは Unicode をサポートしていないため、コンソールで目的の出力を生成することはできません。
これらの関連する質問と有用な回答を見つけまし た Unicode 文字を表示する Windows コマンド シェルはありますか? ソース ファイルに Unicode 文字列定数を埋め込むにはどうすればよいですか?
この質問もご覧になることをお勧めします。一部のコンパイラを使用して実際にUnicode文字をファイルにハードコードする方法を示しています(オプションがMSVCになるかどうかはわかりません)。
これは明らかにバグです。それはどうしてですか?
他のオペレーティング システムでは従来の文字エンコーディングが廃止され、UTF-8 に切り替えられましたが、Windows では、「OEM」コード ページ (コマンド プロンプトで使用される) と「ANSI」コード ページ (GUI で使用される) の2 つの従来のエンコーディングが使用されます。
C++ ソース ファイルは ANSI コード ページ 1252 (または 1254、1256、または 1258) ですが、コンソールはそれを OEM コード ページ 850 として解釈しています。
IDEとコンパイラはANSIコードページを使用します。コンソールはOEMコードページを使用します。
これらの変換関数で何をしているかも重要です。