問題は、コンソールがシステムの残りの部分とは異なるコード ページを使用することです。たとえば、通常、南北アメリカと西ヨーロッパ向けにセットアップされた Windows システムは CP1252 を使用しますが、これらの地域のコンソールは CP437 または CP850 を使用します。
使用しているエンコーディングに一致するようにコンソール出力コード ページを設定するか、コンソールの出力コード ページに一致するように文字列を変換することができます。
コンソール出力コードページを設定します。
SetConsoleOutputCP(GetACP()); // GetACP() returns the system codepage.
std::cout << "La chaîne qui correspond au code \"TEST_CODE\" n'a pas été trouvée à l'aide locale \"fr\".";
または、エンコーディング間で変換する多くの方法の 1 つ (これには VS2010 以降が必要です):
#include <codecvt> // for wstring_convert
#include <locale> // for codecvt_byname
#include <iostream>
int main() {
typedef std::codecvt_byname<wchar_t,char,std::mbstate_t> codecvt;
// the following relies on non-standard behavior, codecvt destructors are supposed to be protected and unusable here, but VC++ doesn't complain.
std::wstring_convert<codecvt> cp1252(new codecvt(".1252"));
std::wstring_convert<codecvt> cp850(new codecvt(".850"));
std::cout << cp850.to_bytes(cp1252.from_bytes("...été trouvée à...\n")).c_str();
}
後者の例では、実際に 1252 と 850 の間で変換する必要があると想定しています。実際のターゲット コード ページを把握するには、関数 GetOEMCP() を使用する必要があります。プログラムを実行しているマシンでの GetACP() の結果。
また、このプログラムは、標準で保証されていないことに依存していることにも注意してください。つまり、ロケール間で wchar_t エンコーディングを共有する必要があります。これは、ほとんどのプラットフォームに当てはまります。通常、すべてのロケールで wchar_t に何らかの Unicode エンコーディングが使用されますが、すべてではありません。
理想的には、どこでも UTF-8 を使用でき、最近の他のプラットフォームと同様に、次のようにすれば問題なく動作します。
#include <iostream>
int main() {
std::cout << "La chaîne qui correspond au code \"TEST_CODE\" n'a pas été trouvée à l'aide locale \"fr\".\n";
}
残念ながら、Windows は、UTF-16 を wchar_t エンコーディングとして放棄して 4 バイトの wchar_t を採用するか、標準の要件に違反して標準準拠のプログラムを壊すことなく、この方法で UTF-8 をサポートすることはできません。