ホームページ >バックエンド開発 >C++ >Windows で std::cout を使用してクロスプラットフォーム UTF-8 出力を実現するにはどうすればよいですか?

Windows で std::cout を使用してクロスプラットフォーム UTF-8 出力を実現するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-03 06:45:30314ブラウズ

How to Achieve Cross-Platform UTF-8 Output with std::cout on Windows?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。