日本語(UTF-8)が通るncurses-ruby環境の構築

topぽいUIの監視ツールが作りたかったのでncursesを使ってみたけどUTF-8文字列が文字化けして表示できなかったので解決策をメモ。

ncursesはそもそもマルチバイト文字の表示に対応していないので、その対応版であるncurseswを使う必要がある。
多くのディストリビューションではそもそもこれは別パッケージとして提供されているので注意。

基本的にはncurseswはncursesとソースコードレベル互換ぽいので、ncursesのrubyバインディングであるncurses-rubyを適当にいじってncursesw野バインディングとして利用することにする。

ncurses-rubyをncurseswとコンパイル

最新版を以下のサイトからダウンロード。

http://ncurses-ruby.berlios.de/

そもそも、(2010/8/1現在)ruby1.9対応版がrubygemsにあがっていないらしくどちらにせよコンパイルする必要がある。

そしてncurseswに差し替えるために次のパッチをあてる。
http://static.nyaxtstep.com/misc/ncurses-ruby.1.2.4.extconf.patch

パッチを当てたらあとはコンパイルしてインストールするだけなのだけど、rbcursesプロジェクトでgemspecが配布されているので今回は管理にgemを用いることにする。
手順は以下のページを参考にした。

http://github.com/rkumar/rbcurse/tree/master19

gemspecファイルをgistからダウンロードする。

$ gem build ncurses.gemspec
$ sudo gem install --local ncurses-1.2.4.gem

localeの設定

ncurseswを用いて実際にマルチバイト文字を表示させるにはlocaleを適切に設定してやる必要がある。

C言語

setlocale( LC_ALL, "" );

相当をrubyで書く必要がある。

今回はncurses-rubyがsetlocaleへのバインディングを提供しているようなのでそれを活用する。

require 'rubygems'
require 'ncurses'

Ncurses.setlocale(Ncurses::LC_ALL, "")

これをNcurses.initscr前に書いてあげればOK。