std::cout を使用した Windows でのクロスプラットフォーム UTF-8 出力
文字列がエンコードされる C でのクロスプラットフォーム アプリケーションの開発時UTF-8 では、異なるオペレーティング システム間でそれらが正しく処理されることを確認することが重要です。 Unix システムでは、std::cout は UTF-8 でエンコードされた 8 ビット文字列を問題なく想定します。ただし、Windows では、Latin-1 または同様の非 Unicode 形式がデフォルトになります。
この問題に対処するために、コードは _setmode() を使用して、std::cout に 8 ビット文字列を強制的に解釈させようとします。 Windows では UTF-8。ただし、これにより Visual Studio 2015 でアサーション エラーが発生します。
これを解決するには、より包括的なアプローチが必要です。以下に示すコードは、さまざまなソースからの洞察を組み合わせたものです:
<code class="cpp">#include <string> #include <iostream> #include <Windows.h> #include <cstdio> int main() { // Set console code page to UTF-8 SetConsoleOutputCP(CP_UTF8); // Enable stream buffering to prevent byte-by-byte output setvbuf(stdout, nullptr, _IOFBF, 1000); std::string test = u8"Greek: αβγδ; German: Übergrößenträger"; std::cout << test << std::endl; return 0; }</code>
まず、SetConsoleOutputCP() 関数を使用してコンソールのコード ページを UTF-8 に設定し、受信したバイト ストリームを解釈する必要があることを示します。 as UTF-8.
次に、setvbuf() を使用して std::cout のバッファリングを有効にします。これは、Visual Studio の STL 実装のデフォルトの動作では、基礎となるファイルに個々のバイトを渡すため、UTF-8 バイト シーケンスで問題が発生するためです。バッファリングによりこの問題が防止され、パフォーマンスが向上します。この例に示すように、std::endl を使用してストリームを定期的にフラッシュすることもお勧めします。
最後に、非 ASCII Unicode 文字を正しく表示するには、Windows コンソールで TrueType フォントを使用する必要があることに注意してください。これは Windows 10 のデフォルトですが、Windows 7 以前では、ユーザーが手動で Consolas などのフォントに変更する必要がある場合があります。
以上がWindows で std::cout を使用してクロスプラットフォーム UTF-8 出力を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。