locked
バージョン 1809 の OS 上でコンソール出力が正しく表示されない問題について

    全般的な情報交換

  • こんにちは、Visual Studio サポート チームです。

    今回は Windows 10 October Update (version 1809) ならびに Windows Server 2019Windows Server version 1809 において発生するコンソール出力時の問題についてご案内します。

     

     

    現象

    WriteFile WriteConsoleA API を使用してマルチバイト文字のコンソール出力を行うアプリケーションにおいて、Windows 10 October Update (version 1809)Windows Server 2019、および Windows Server version 1809 上ではコンソール出力が正しく表示されない場合があります。

    また、fprintf 系の標準 C ライブラリ関数で stderr へ出力を行った場合や、std::coutstd::cerr といった C++ の出力ストリーム オブジェクトを利用した場合にも同様の問題が発生します。

     

     

    原因

    本問題は対象のバージョンの OS で導入された新しいコンソールの不具合に起因して発生しています。

    出力ストリームに紐づけられた内部的なコードページ テーブルの初期化処理に不足があり、内部処理でマルチバイト文字を正しく認識することができず、正しくコンソール出力を行えない問題が発生します。

     

     

    対処策

    以下のいずれかの方法で問題を解消することが可能です。

     

    方法1

    コマンド プロンプトの [プロパティ] から [レガシー コンソールを使用する] にチェックを入れて [OK] を選択し、コマンド プロンプトを再起動します。

    本設定により、以降はバージョン 1803 以前の OS と同じ実装のコンソールが使用されるようになり、バージョン 1809 の新しいコンソールの不具合を回避することができます。

      

      

     

    方法2

    アプリケーションの初期化処理などで setlocale 関数等を利用して明示的にロケールの設定を行ないます。

    これにより 原因の項で述べた初期化の不足の問題が対処され、正しくコンソール出力を行うことができるようになります。

     

    <コード例>

     

    // 以下の 1 行を追加します

    setlocale(LC_ALL, "");

     

    std::string s{ "日本語" };

    std::cout << s << std::endl;

     

     

     

    状況

    マイクロソフトでは開発部門でも本問題を認識しており、次期バージョンの OS (19H1) において修正される予定です。

    バージョン 1809 に対する修正プログラムの提供についても検討されておりますが、現時点では詳細は未定です。

    このため、ご不便をおかけいたしますが、上記の対処策についてもご検討くださいますようお願い申し上げます。

    弊社製品の不具合でご迷惑をおかけしておりますこと、深くお詫び申し上げます。


    2019年1月16日 10:42
    所有者