2009-11-12 10 views
6

先週、私はroguelikeのゲームをC++で、友達と一緒に作業してきました。ほとんどはあまりにも言語を学ぶ。Windows端末でユニコード文字を出力する

私が使用しています:

  • pdcurses
  • のWindows 7
  • のVisual Studio C++

を出力wchar_t年代に私がコンソールにしたいところはどこでも。私は\ u263B(☻)のようないくつかのユニコード文字を出力に成功させましたが、\ 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文字を使用することもできます。しかし、完全なユニコードセットのキャラクターで遊ぶのは本当に素晴らしいことです。

合計:ユニコード文字が正しく出力されるようにするにはどうすればよいですか?


編集:

[OK]をので、私は私のエンコードが正しく動作している考え出しました。問題は、私はよりユニコード豊富なフォントフェイスに切り替えることを強制する必要があります。これを行うためのクロスプラットフォームの方法はありますか?これを行うためのWindows固有の方法さえありますか?

+2

Spolskyの「すべてのソフトウェア開発者が絶対に最低限必要なことは、絶対にUnicodeと文字セットについて肯定的に知っておく必要があります。明らかに、キャラクターセットを使って作業する場合、次の息をとる前にそれを読んでいるはずです。http://www.joelonsoftware.com/articles/Unicode.html –

+0

私はキャラクターセットに関するいくつかの経験がありますが、それを読んでいません特定の記事。私はそれをチェックします、チップのおかげで:) –

答えて

2

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

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

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

しかし、あなたの問題はそこで終わりません。 WindowsのウェスタンロケールインストールではLucida Consoleが提供されていますが、そのフォントは限られた書体のサブセットしか提供しません。日本語のWindows PC上で日本語のテキストをコンソールに出力/入力できると仮定します。あなたはそれがそこで動作することを確認したい場合は、日本のWindows上で利用可能なものを確認する必要があります。

Linux(Ubuntu、少なくとも)は、ここではUTF-8を使用し、幅広い書体のサポートを備えたフォントを提供しています。私は他のディストリビューションをチェックしてその物語が何であるかを確認しておらず、端末でフォントがどのように解決されているかチェックしていません(Xのものであれ、Gnomeのものであれ)。

+0

私はいくつかのバグを取り除かなければならなかったので、まだシェルリンクの作成を試みていません。しかし、この返事は私の質問にうまく答えます。ありがとう:) –

2

原則として、すべてのユニコード文字がコンソールでサポートされています。あなたが疑問符を見ているという事実は、おそらくそれらの文字のフォントサポートと関係があります。コンソールフォントを非常に良いユニコードサポートで何かに切り替えてみてください。

+0

私はこれを行うにはユーザーに依存する必要がありますか?または、アプリケーション内のフォントを強制的に変更することはできますか? –

+0

+1、これは確かにシナリオでしたが、解決策はdev-machineでしか動作しません。/ –

2

コードページを適切に設定する必要があります。ここにはかなり良い記事があります:link

+0

プラットフォーム固有のメソッドを使用するのは好きではありませんが、UTF-8を取得するには 'SetConsoleCP(65001); 'を試しました。 ..働かなかった。 –

1

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

関連する問題