2008年8月6日水曜日

C言語のNcursesで日本語を扱う

Ncursesというのは端末をいろいろ操作するライブラリ。昔、同様のCursesというのがあって、Ncurses(New Curesesの意味)はその後継。
端末上でグリグリ操作するようなアプリケーションは、これを使わなければ実現できない。端末上で動作するviやEmacs、nanoなんかのコマンドラインエディタ(テキストエディタ)もこれを使って実装してあるんだろう。

RubyやPythonなどのスクリプト言語などでもNcurses(またはCurses)が使えるようになってたりする。

C言語でNcursesを使う場合、まずinitscr()で初期化し、最後にendwin()で後処理をする。
これで、addstr()などで端末上の好きな場所に文字列を表示したりできる。
Ncursesは標準のライブラリでないので、コンパイル時にgccには-lncursesオプションを付けなければならないので注意。

そして、日本語(2バイト文字)を扱う場合はちょっと1手間必要なので、ここに書いておく。

まず、ダメな例。1秒間「ほげほげ」とだけ表示して終了するプログラム。
#include <ncurses.h>
main(){
initscr();
addstr("ほげほげ");
refresh();
usleep(1000000);
endwin();
}

これだと、「ほげほげ」が文字化けしてしまう。

日本語(2バイト文字)に対応させるには次のようにコードを書き、なおかつgccには-lncursesオプションではなく-lncurseswオプションを付ける。(末尾にwを付加)
#include <ncurses.h>
#include <locale.h>
main(){
setlocale(LC_ALL,"");
initscr();
addstr("ほげほげ");
refresh();
usleep(1000000);
endwin();
}

これだと、日本語(2バイト文字)が扱える。

wはwide charactorの意味。Ncursesを2バイト文字に対応させたもので、Ncurseswという。

NcursesとNcurseswは別のパッケージとして配布されているので、自分の環境を要確認。
UbuntuのSynapticだとNcursesはlibncurses5,libncurses5-devというパッケージ名。Ncurseswはlibncursesw5,libncursesw5-devだった。

ちなみに、RubyではまだNcurseswには対応していないらしい。そのせいでRubyで書こうと思っていたプログラムを、今Cで書いているのです。。。


<追記>
コードの < と > をエスケープし忘れてたのを直しました。

0 件のコメント: