質問: linuxでcursesライブラリを使って半角カナが上手く制御できない linux red hat 6.1 を使っています。 cursesライブラリを使用して、linuxconf のようなウィザードを造っています。 半角カナの扱いで今困っています。 mvprintw(10, 16, "aaaaaaaaaaaa"); mvprintw(11, 16, "aaaaaaaaaaaa"); refresh(); [補足] ・上記の mvprintw()関数は、仮想画面に書く関数です。 printf()みたいなものです。 数字は左上を (0,0)原点としたxy座標で、その位置から書かれます。 refresh()関数は仮想画面を物理画面に描画して、目視できるようになります。 ・上記では文字化けするといけないので、「a」としています。 「a」:半角カナの「ア」 と解釈してください。 [結果] 上記のように実行すると、2行目の表示がおかしくなります。 2行目は (11, 16) から書き出す要求をしているにもかかわらず、行頭からの 表示となってしまいます。 ---------------aaaaaaaaaaaa aaaaaaaaaaaa 「-」は空白です。 kterm 上でいろいろ試したところ、なぜか kterm のライン数を大きくすると この現象が回避されました。 因果関係は全くわからず、また、ライン数を大きくする以外の回避策も 見つからず困っています。 <追加情報です> ktermのライン数は同じのまま、y座標を変えて、(10, 15), (11, 15) と したところ正常に表示されました。 y座標が「15以下」だと正常に表示されるみたいです。 ますます原因がわからない。。。 識者の方、ご教授願います。
回答: okとなる場合、「ア」の行を書いたあと、「イ」を書く座標を明 示的に指定してジャンプしているので、問題なく表示されています。 これに対して、ngとなる場合、「ア」を10個書いたあと、1行下 に移動("lf" = 0a)し、20桁左に移動("esc [ 2 0 d" = 1b 5b 32 30 44)しています。 半角カナを10個書いて20桁左に行くので、戻りすぎてしまい、表示 がおかしくなるようです。curses が、半角カナが1桁分の幅しかな いことを認識していないということですね。 なぜ、kterm の大きさや座標の微妙な差で、結果に違いがあるのか というと、curses は、同じ表示になるなら、なるべく短い出力を 出すように工夫するからです。ちょっとした出力文字数の差で、違 うやり方を選択するので、偶然うまく行ったりいかなかったりする わけです。(もっとも、本当に最適かどうかはわかりません。この 例では、どの場合でも、直接座標を指定するのは文字数的に損して る気がします。) linux の je というパッケージに、日本語化された pcurses とい うのが入っているらしいですが、詳しくは知りません。日本語化さ れたといっても、半角カナが扱えない可能性も高いです。 もし、これを入れてみてもだめなら、半角カナにはこだわらない方 がいいかと思います。あるいは、curses をやめて、termcap を直 接いじるかですね。