※ ChatGPTを利用し、要約された質問です(原文:LinuxでCursesライブラリを使って半角カナが上手く制御できない)
LinuxでCursesライブラリを使って半角カナが制御できない
このQ&Aのポイント
Linux Red Hat 6.1を使用して、cursesライブラリを使ってウィザードを作成していますが、半角カナの扱いで問題が発生しています。
mvprintw()関数を使用して仮想画面に文字を書き込む際、半角カナの表示位置が正常にならない現象が発生しています。
ktermのライン数を変更すると、半角カナの表示位置の問題が一時的に解消されることがわかりましたが、その原因や他の解決策は分かりません。
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以下」だと正常に表示されるみたいです。
ますます原因がわからない。。。
識者の方、ご教授願います。
補足
punchan_jp さん、解析、アドバイスありがとうございました。 とても参考になりました。 原因がわからなかったためモヤモヤしていましたが、原因がわかって すっきりしました。 私の方もいろいろ試したところ、なんとか回避できそうです。 curses が明示的に座標にジャンプする/しないの条件はわからないのですが、 行の最後で改行コードを入れるとOKみたいです。 実際のコードでは、半角カナのデータを仮想画面に書いた後 mvprintw(x, (COLS - 1), "\n"); としました。 で、refresh() 関数で物理画面に描画すれば乱れませんでした。 ただし、半角カナのデータの最後に「\n」を付加した場合は駄目でした。 あと、refresh() 前に move() 関数でカーソル移動させるとカーソル位置が 乱れてしまいました。 カーソル移動は物理描画後にしました。 UNIX、Linux では半角カナを使わないのがいいんですが、どうしても 使わなきゃいけなかったので苦労しました。。。 本当にご協力ありがとうございました。 感謝します。