私はWindows上でmingwの環境でのgccを使用しますが、私はそれがC++のロケールをサポートしていません集めるものとされていません。
これはC++ロケールをサポートしていないので、これは実際には関係ありませんが、FYIでは、Windowsは他のほとんどのプラットフォームと同じロケール命名方式を使用しません。彼らは同様のlanguage_country.encodingを使用しますが、言語と国はコードではなく、エンコードはWindowsのコードページ番号です。ロケールは "English_United States.65001"ですが、これはサポートされている組み合わせではありません(コードページ65001(UTF-8)はロケールの一部としてサポートされていません)。
ws1
だけが印刷される理由は、文字\u20AC
が印刷されると、ストリームが失敗し、失敗ビットが設定されるためです。さらに何かが印刷される前にエラーをクリアする必要があります。
C++ 11には、移植可能UTF-8に対処しますいくつかのことを紹介したが、すべてがまだサポートされていない、と追加が問題を完全に解決しません。しかし、ここでの方法の物事が現在スタンドです:
char16_t
と
char32_t
は、ネイティブ型ではなく、型定義を使用すると、標準のcodecvtファセット特殊化を使用することができるようになりますようVSでサポートされている
codecvt<char16_t,char,mbstate_t>
とUTF-16またはの間で変換するのに必要とされるcodecvt<char32_t,char,mbstate_t>
UTF-32、およびUTF-8(実行文字セットまたはシステムエンコーディングではなく)です。現在のVS(およびVS11DP)ではこれらの型はtypedefのみであり、テンプレートの特殊化はtypedefでは機能しませんが、コードは既に#ifdef
の背後に保護されているVS 2010のヘッダーにあります。
標準では、codecvt_utf8とcodecvt_utf8_utf16がサポートされている特殊なコーデックファセットテンプレートも定義されています。前者は、使用するワイド文字型のサイズに応じて、UTF-8とUCS-2またはUCS-4の間で変換します。後者は、ワイド文字のサイズとは無関係にUTF-8とUTF-16のコード単位を変換しますタイプ。
std::wcout.imbue(std::locale(std::locale::classic(),new std::codecvt_utf8_utf16<wchar_t>()));
std::wcout << L"ØÀéîðüýþ\n";
これは、wcoutに添付されているものを介してUTF-8コードユニットを出力します。出力がファイルにリダイレクトされている場合、それを開くとUTF-8でエンコードされたファイルが表示されます。 Windowsのコンソールモデルと標準ストリームの実装方法により、コンソール出力コードページをUTF-8に設定しても、このようにコマンドプロンプトでUnicode文字を正しく表示することはできませんSetConsoleOutputCP(CP_UTF8)
)。 UTF-8コードユニットは、一度に1つずつ出力され、コンソールは、各チャンク(この場合は1バイト)が完全で有効なエンコーディングになることを期待して、渡された個々のチャンクを調べます。チャンク内の不完全または無効なシーケンス(この場合はすべてのマルチバイト文字表現のすべてのバイト)は、文字列が表示されるときにU + FFFDに置き換えられます。
iostreamを使用する代わりに、C関数puts
を使用してUTF-8エンコードされた文字列全体を書き出すと(コンソール出力コードページが正しく設定されている場合)、UTF-8文字列を出力して表示できますコンソールで同じcodecvtファセットがこれを行うには、いくつかの他のC++ 11 convinenceクラスで使用することができます:それはwchar_t型はUTF-16、ケースがオンであることを前提としているため
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>,wchar_t> convert;
puts(convert(L"ØÀéîðüýþ\n).to_bytes().c_str());
以上、まだ非常にポータブルではありませんWindowsは、ほとんどの他のプラットフォームではなく、標準では必要ありません。 (実際には、UTF-16はいくつかの文字を表すために複数のコード単位を必要とし、標準では選択したエンコーディングのすべての文字を単一のwchar_tで表現できる必要があるため、技術的には適合しません。
std::wstring_convert<std::codecvt_utf8<wchar_t>,wchar_t> convert;
以上が移植UCS-4およびUSC-2を処理するが、UTF-16を使用して、プラットフォームの基本多言語面の外側に動作しません。
あなたはwchar_t
の大きさに基づいて、これらの2つの側面の間で選択するためにconditional
型特性を利用し、主に働く何かを得ることができます:
std::wstring_convert<
std::conditional<sizeof(wchar_t)==2,std::codecvt_utf8_utf16<wchar_t>,
std::codecvt_utf8<wchar_t>
>::type,
wchar_t
> convert;
それとも、あなたの場合は、適切な型定義を定義するために、プリプロセッサマクロを使用しますコーディング標準はマクロを許可します。
ありがとうございました! –