WindowsターミナルにUnicode文字を出力します
質問
先週、私はaに取り組んできました roguelike 友達と一緒にC ++のゲーム。主に言語を学びます。
私が使用しています:
- pdcurses
- Windows7
- Visual Studio C ++
出力へ wchar_t
コンソールのどこにいても。私は u263b(☻)などのいくつかのユニコード文字をotuputすることに成功しましたが、 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);
}
もちろん、退屈なアンシルキャラクターに頼ることができました。しかし、一緒に遊ぶキャラクターの完全なユニコードセットを持っていることは本当に素晴らしいことです。
要約すると: Unicode文字が正しく出力されることをどのように確認しますか?
編集:
わかりました、だから私は自分のエンコードが正しく機能していることを理解しました。問題はそれです 端末に、よりユニコードが豊富なフォントフェイスに切り替えるように強制する必要があります. 。これを行うためのクロスプラットフォームの方法はありますか?これを行うためのWindows固有の方法もありますか?
解決
問題は、端末に、よりユニコードが豊富なフォントフェイスに切り替えるように強制する必要があることです。これを行うためのクロスプラットフォームの方法はありますか?これを行うためのWindows固有の方法もありますか?
私はこれを探していましたが、それを行うためのWindows API呼び出しが見つかりませんでした(もちろん、私はそれを見つけられなかったことを意味するかもしれません)。私はそれを行うためのクロスプラットフォームの方法を見つけることを期待していません。
私が考えることができる最良の解決策は、特別に構築されたものを使用してコンソールを起動することです シェルリンク (.lnk)ファイル。あなたが読んだら ファイル形式のドキュメント, 、フォントを指定できることがわかります。
しかし、あなたの問題はそこで終わりません。 Windowsの西部のロケールインストールが提供されます Lucidaコンソール, 、しかし、そのフォントはグラフメムの限られたサブセットのみを提供します。日本のWindows PCにコンソールに日本のテキストを出力/入力できると思います。日本の窓で何が利用できるかを確認する必要があります。
Linux(少なくともUbuntu)は、UTF-8を使用して、幅広いグラフェムサポートを備えたフォントを提供する、ここでははるかに優れたサポートがあるようです。ストーリーが何であるかを確認するために他のディストリビューションをチェックしておらず、端末でフォントがどのように解決されるかを確認していません(Xのもの、gnomeのものなど)。
他のヒント
原則として、すべてのUnicode文字はコンソールでサポートされています。疑問符が表示されているという事実は、おそらくそれらのキャラクターのフォントサポートに関係しています。非常に優れたUnicodeサポートを備えたコンソールフォントを何かに切り替えてみてください。
コードページを適切に設定する必要があります。ここにはかなり良い記事があります: リンク
かなり大きなスイッチですが、特にroguelikeをしている場合は、代替コンソールを使用してみてください。 libtcod C ++バインディングでCで書かれた中程度の人気のライブラリで、独自のフォントとグリフを設定できるフルカラーコンソールを提供します。これにより、Windowsコンソールが提供するものに固執するよりもはるかに柔軟になります。