6

この 1 週間、私は友人と一緒に C++ でローグライクゲームに取り組んでいました。ほとんどの場合、言語も学びます。

私は使用しています:

  • pdcurses
  • ウィンドウズ7
  • ビジュアル スタジオ C++

wchar_tコンソールの好きな場所に出力します。\u263B (☻) などの一部の Unicode 文字の出力には成功しましたが、\u2638 (☸) などの他の文字はクエスチョン マーク (?) になってしまいます。

出力に使用する関連コードを次に示します。

// Container of room information

struct RoomInfo
{
    wchar_t * layout;
    int width;
    int height;
};

// The following function builds RoomInfo 

RoomInfo Room::examine(IActor * examinor)
{
    RoomInfo ri;
    ri.width = this->width;
    ri.height = this->height;
    ri.layout = new wchar_t[height * width];
    for(unsigned int y = 0; y < height; y++)
    {
        for(unsigned int x = 0; x < width; x++)
        {
            ri.layout[y*width + x] = L'\u263B'; // works
            //ri.layout[y*width + x] = L'\u2638'; // will not work
        }
    }
}

// The following function outputs RoomInfo

void CursesConsole::printRoom(RoomInfo room)
{
    int w = room.width;
    int h = room.height;

    WINDOW * mapw = newwin(h, w, 1, 0);
    for(int y = 0; y < h; y++)
    {
        wmove(mapw, y, 0);
        for(int x = 0; x < w; x++)
        {
            int c = y*w + x;
            waddch(mapw, room.layout[c]);
        }
    }

    wrefresh(mapw);
    delwin(mapw);
}

もちろん、退屈な ANSI 文字に頼ることもできます。しかし、完全な Unicode セットの文字で遊べるというのは本当にすばらしいことです。

要約すると、Unicode 文字が正しく出力されるようにするにはどうすればよいでしょうか?


編集:

わかりました。エンコーディングが正しく機能していることを確認しました。問題は、端末を強制的に Unicode リッチの font face に切り替える必要があることです。これを行うクロスプラットフォームの方法はありますか? これを行うためのWindows固有の方法さえありますか?

4

4 に答える 4

2

原則として、すべての Unicode 文字がコンソールでサポートされています。疑問符が表示されているという事実は、おそらくそれらの文字のフォント サポートに関係しています。コンソールのフォントを、Unicode を非常によくサポートするものに切り替えてみてください。

于 2009-11-12T20:46:53.957 に答える
2

コード ページを適切に設定する必要があります。それについてはかなり良い記事があります:リンク

于 2009-11-12T20:48:44.123 に答える
2

問題は、端末をよりユニコードリッチなフォントフェイスに強制的に切り替える必要があることです。これを行うクロスプラットフォームの方法はありますか? これを行うためのWindows固有の方法さえありますか?

私はこれを探しましたが、それを行うための Windows API 呼び出しを見つけることができませんでした (もちろん、見つけられなかったということかもしれません)。それを行うためのクロスプラットフォームの方法を見つけることは期待していません。

私が考える最善の解決策は、特別に構築されたShell Link (.LNK) ファイルを使用してコンソールを起動することです。ファイル形式のドキュメント を読むと、フォントを指定できることがわかります。

しかし、あなたの問題はそれだけではありません。Windows の西欧ロケール インストールではLucida Consoleが提供されますが、そのフォントでは限られた書記素のサブセットしか提供されません。日本語の Windows PC で、コンソールに日本語のテキストを出力/入力できることを前提としています。日本語版 Windows で動作することを確認したい場合は、日本語版 Windows で何が利用できるかを確認する必要があります。

Linux (少なくとも Ubuntu) は、UTF-8 を使用し、広範な書記素サポートを備えたフォントを提供することで、ここでははるかに優れたサポートを提供しているようです。他のディストリビューションをチェックしてストーリーが何であるかを確認したり、ターミナルでフォントがどのように解決されるかを確認したりしていません(Xのものであるか、Gnomeのものであるかなど)。

于 2009-11-12T23:09:49.093 に答える
1

これはかなり大きなスイッチですが、特にローグライクゲームをしている場合は、別のコンソールを使用してみてください。libtcodは、C ++バインディングを使用してCで記述された適度に人気のあるライブラリであり、独自のフォントとグリフを設定できるフルカラーコンソールを提供します。これにより、Windowsコンソールが提供するものに固執するよりもはるかに柔軟性が高くなります。 。

于 2012-01-23T19:50:09.307 に答える