4    curses ライブラリ・ルーチンを使用したワイド文字の処理

curses ライブラリには,文字端末用のユーザ・インタフェースを開発するための関数が含まれています。 この章では,curses ライブラリ関数の拡張機能について説明します。 これらの拡張機能により,マルチバイト文字を収納できるワイド文字フォーマットが使用できるようになります。

ワイド文字や複合文字フォーマットのマルチバイト文字の処理には,X/Open Curses CAE Specifications Version 4.2 に準拠する関数を使用してください。 これらの関数は,System V 国際化機能 (MNLS: Multi-National Language Supplement) に規定されている関数に代わるものです。

この章では,画面上の,またはキーボードから入力した文字や文字列を処理する curses 関数とマクロの概要について説明します。 各節の表では,同じ処理を実行できる curses インタフェースが複数あるかどうかと,国際化ソフトウェアの作成に最も適した推奨 curses インタフェースを明記します。 つまり,この表では,ワイド文字や複合文字フォーマットを扱い,X/Open Curses CAE 仕様に準拠している curses ライブラリ関数やマクロに重点を置きます。 アプリケーションでは,表中の「推奨ルーチン」欄にリストされている curses インタフェースを使用してください。

各インタフェースの構文と詳細については,セクション 3 のリファレンス・ページを参照してください。 この章は,実行したい操作に必要なインタフェースを見つけるためにご利用ください。 その後,man コマンドを使用して,必要なインタフェースのリファレンス・ページを表示してください。 curses ライブラリに含まれる関数の概要については, curses(3) のリファレンス・ページを参照してください。

注意

一部の curses ルーチンは,curses ウィンドウ上に表示されている文字を上書きします。 文字を完全に上書きできるルーチンは,wchar_t または cchar_t 型のデータを使用するルーチンだけです。 マルチバイト文字のように,上書きされる文字の表示幅が 1 カラムより大きいときは,これらのインタフェースは文字の残った部分を消去するために,空白文字を書き込みます。 たとえば,2 カラム幅の中国語文字の 1 カラム目を英字の a で上書きした場合,中国語文字の 2 カラム目は,空白文字で上書きされます。

国際化されていない curses ルーチンでマルチバイト文字を上書きしたときの動作は未定義です。

4.1    curses ウィンドウへのワイド文字の書き込み

以下の項では,curses ウィンドウ上にワイド文字を追加したり,挿入するルーチンを説明します。 ターゲットとなる場所に既に文字が存在する場合,これらのルーチンは次のいずれかの操作を行います。

4.1.1    ワイド文字を追加 (上書き) し,カーソルを進める

表 4-1 のルーチンは,画面上のウィンドウにワイド文字とその属性を追加し,カーソルを進めます。 文字がすでにターゲット位置に存在するときは,その文字は追加する文字で上書きされます。

ルーチンを選択する条件は,次のとおりです。

これらのルーチンにワイド文字とその属性を渡すには,const cchar_t データ型を使用します。

表 4-1:  ワイド文字を追加し,カーソルを進める curses ルーチン

推奨ルーチン 代替ルーチン 動作
add_wch addchaddwch

ウィンドウ: 省略時

位置: 現在

画面の再表示: しない

wadd_wch waddchwaddwch

ウィンドウ: 指定

位置: 現在

画面の再表示: しない

mvadd_wch mvaddchmvaddwch

ウィンドウ: 省略時

位置: 指定

画面の再表示: しない

mvwadd_wch mvwaddchmvwaddwch

ウィンドウ: 指定

位置: 指定

画面の再表示: しない

echo_wchar echowchar

ウィンドウ: 省略時

位置: 現在

画面の再表示: する

wecho_wchar wechowchar

ウィンドウ: 指定

位置: 現在

画面の再表示: する

4.1.2    ワイド文字を (上書きせずに) 挿入し,カーソルを進めない

表 4-2のルーチンは,現在の座標または指定した座標でワイド文字列をウィンドウに挿入し,書き込み操作後にカーソル位置を変更しません。 ワイド文字は,ターゲット位置にある既存の文字の前に挿入されます。 このため,これらのルーチンは,行内にすでにある文字は上書きしません。 ターゲット位置とその右側にある既存の文字は右方向に移動され,右端の文字は切り捨てられます。 このカテゴリのインタフェースを選択する条件は,次のとおりです。

表 4-2:  ワイド文字を挿入し,カーソルを進めない curses ルーチン

推奨ルーチン 代替ルーチン 動作
ins_wch inschinswch

ウィンドウ: 省略時

位置: 現在

wins_wch winschwinswch

ウィンドウ: 指定

位置: 現在

mvins_wch mvinschmvinswch

ウィンドウ: 省略時

位置: 指定

mvwins_wch mvwinschmvwinswch

ウィンドウ: 指定

位置: 指定

4.2    curses ウィンドウへのワイド文字列の書き込み

以下の項では,curses ウィンドウに文字列を追加したり,挿入するルーチンについて説明します。

4.2.1    ワイド文字列を追加 (上書き) し,カーソルを進めない

表 4-3のルーチンは,ワイド文字列とその文字属性をウィンドウに追加します。 ただしこれらのルーチンには,次の特徴があります。

これらのルーチンでは,ターゲット位置にすでに存在している文字は,追加する文字列の文字で上書きされます。 このカテゴリのインタフェースを選択する条件は,次のとおりです。

表 4-3:  ワイド文字列を追加しカーソルを進めない curses ルーチン

推奨ルーチン 代替ルーチン 動作
add_wchstr addwchstr

文字数: すべて

ウィンドウ: 省略時

位置: 現在

add_wchnstr addwchnstr

文字数: 指定

ウィンドウ: 省略時

位置: 現在

wadd_wchstr waddwchstr

文字数: すべて

ウィンドウ: 指定

位置: 現在

wadd_wchnstr waddwchnstr

文字数: 指定

ウィンドウ: 指定

位置: 現在

mvadd_wchstr mvaddwchstr

文字数: すべて

ウィンドウ: 省略時

位置: 指定

mvadd_wchnstr mvaddwchnstr

文字数: 指定

ウィンドウ: 省略時

位置: 指定

mvwadd_wchstr mvwaddwchstr

文字数: すべて

ウィンドウ: 指定

位置: 指定

mvwadd_wchnstr mvwaddwchnstr

文字数: 指定

ウィンドウ: 指定

位置: 指定

4.2.2    ワイド文字列を追加 (上書き) し,カーソルを進める

4.2.1 項で説明したルーチンと同じように,表 4-4 のルーチンもワイド文字列 (ビデオ文字属性は除く) をウィンドウに追加し,既存の文字を上書きします。 ただし,これらのルーチンは,次の処理も実行します。

このカテゴリのインタフェースを選択する条件は,次のとおりです。

表 4-4:  ワイド文字列を追加しカーソルを進める curses ルーチン

推奨ルーチン 代替ルーチン 動作
addwstr addstr

文字数: すべて

ウィンドウ: 省略時

位置: 現在

addnwstr 代替ルーチンなし

文字数: 指定

ウィンドウ: 省略時

位置: 現在

waddwstr waddstr

文字数: すべて

ウィンドウ: 指定

位置: 現在

waddnwstr 代替ルーチンなし

文字数: 指定

ウィンドウ: 指定

位置: 現在

mvaddwstr mvaddstr

文字数: すべて

ウィンドウ: 省略時

位置: 指定

mvaddnwstr 代替ルーチンなし

文字数: 指定

ウィンドウ: 省略時

位置: 指定

mvwaddwstr mvwaddstr

文字数: すべて

ウィンドウ: 指定

位置: 指定

mvwaddnwstr 代替ルーチンなし

文字数: 指定

ウィンドウ: 指定

位置: 指定

4.2.3    ワイド文字列を (上書きせずに) 挿入し,カーソルを進めない

表 4-5 で説明するルーチンは,curses ウィンドウ内のターゲット位置の直前に,ワイド文字列を挿入します。 これらのルーチンには,次の特徴があります。

このカテゴリのインタフェースを選択する条件は,次のとおりです。

表 4-5:  ワイド文字列を挿入しカーソルを進めない curses ルーチン

推奨ルーチン 代替ルーチン 動作
ins_wstr inswstr

文字数: すべて

ウィンドウ: 省略時

位置: 現在

ins_nwstr insnwstr

文字数: 指定

ウィンドウ: 省略時

位置: 現在

wins_wstr winswstr

文字数: すべて

ウィンドウ: 指定

位置: 現在

wins_nwstr winsnwstr

文字数: 指定

ウィンドウ: 指定

位置: 現在

mvins_wstr mvinswstr

文字数: すべて

ウィンドウ: 省略時

位置: 指定

mvins_nwstr mvinsnwstr

文字数: 指定

ウィンドウ: 省略時

位置: 指定

mvwins_wstr mvwinswstr

文字数: すべて

ウィンドウ: 指定

位置: 指定

mvwins_nwstr mvwinsnwstr

文字数: 指定

ウィンドウ: 指定

位置: 指定

4.3    curses ウィンドウからのワイド文字の削除

表 4-6 のルーチンは,curses ウィンドウ内のターゲット位置にあるワイド文字を削除します。 その行の,削除された文字以降の文字は,1 文字分左にシフトされます。 これらのルーチンは,マルチバイト文字がサポートされる前から curses ライブラリに含まれており,ワイド文字フォーマットを正しく処理できるように再定義されています。

このカテゴリのインタフェースを選択する条件は,次のとおりです。

表 4-6:  ワイド文字列を削除する curses ルーチン

推奨ルーチン 代替ルーチン 動作
delch 代替ルーチンなし

ウィンドウ: 省略時

位置: 現在

wdelch 代替ルーチンなし

ウィンドウ: 指定

位置: 現在

mvdelch 代替ルーチンなし

ウィンドウ: 省略時

位置: 指定

mvwdelch 代替ルーチンなし

ウィンドウ: 指定

位置: 指定

4.4    curses ウィンドウからのワイド文字の読み取り

表 4-7 のルーチンは,curses ウィンドウからワイド文字とそのビデオ属性を読み取ります。 プログラムに返されるデータは cchar_t 型なので,ワイド文字と属性の両方が格納されます。

このカテゴリのインタフェースを選択する条件は,次のとおりです。

表 4-7:  ウィンドウからワイド文字を読み取る curses ルーチン

推奨ルーチン 代替ルーチン 動作
in_wch inchinwch

ウィンドウ: 省略時

位置: 現在

win_wch winchwinwch

ウィンドウ: 指定

位置: 現在

mvin_wch mvinchmvinwch

ウィンドウ: 省略時

位置: 指定

mvwin_wch mvwinchmvwinwch

ウィンドウ: 指定

位置: 指定

4.5    curses ウィンドウからのワイド文字列の読み取り

curses ウィンドウからワイド文字列を読み取るルーチンには,2 つのセットがあります。 4.5.1 項 の一連のルーチンは,ビデオ属性付きのワイド文字の文字列を読み取ります。 4.5.2 項 の一連のルーチンは,ワイド文字の文字列を,属性を取り除いて読み取ります。

4.5.1    属性付きのワイド文字列の読み取り

表 4-8 のルーチンは,curses ウィンドウからワイド文字列とその文字属性を読み取ります。 推奨ルーチンから返される文字列は,cchar_t データ型です。

このカテゴリのインタフェースを選択する条件は,次のとおりです。

表 4-8:  ワイド文字列とその属性を読み取る curses ルーチン

推奨ルーチン 代替ルーチン 動作
in_wchstr inwchstr

文字数: すべて

ウィンドウ: 省略時

位置: 現在

in_wchnstr inwchnstr

文字数: 指定

ウィンドウ: 省略時

位置: 現在

win_wchstr winwchstr

文字数: すべて

ウィンドウ: 指定

位置: 現在

win_wchnstr winwchnstr

文字数: 指定

ウィンドウ: 指定

位置: 現在

mvin_wchstr mvinwchstr

文字数: すべて

ウィンドウ: 省略時

位置: 指定

mvin_wchnstr mvinwchnstr

文字数: 指定

ウィンドウ: 省略時

位置: 指定

mvwin_wchstr mvwinwchstr

文字数: すべて

ウィンドウ: 指定

位置: 指定

mvwin_wchnstr mvwinwchnstr

文字数: 指定

ウィンドウ: 指定

位置: 指定

4.5.2    属性なしでのワイド文字列の読み取り

表 4-9 のルーチンは,curses ウィンドウからワイド文字列を読み取り,wchar_t データ型の文字列をプログラムの変数に格納します。 ビデオ属性は,文字列に格納される文字から取り除かれます。

このカテゴリのインタフェースを選択する条件は,次のとおりです。

表 4-9:  属性なしでワイド文字列を読み取る curses ルーチン

推奨ルーチン 代替ルーチン 動作
inwstr 代替ルーチンなし

文字数: すべて

ウィンドウ: 省略時

位置: 現在

innwstr 代替ルーチンなし

文字数: 指定

ウィンドウ: 省略時

位置: 現在

winwstr 代替ルーチンなし

文字数: すべて

ウィンドウ: 指定

位置: 現在

winnwstr 代替ルーチンなし

文字数: 指定

ウィンドウ: 指定

位置: 現在

mvinwstr 代替ルーチンなし

文字数: すべて

ウィンドウ: 省略時

位置: 指定

mvinnwstr 代替ルーチンなし

文字数: 指定

ウィンドウ: 省略時

位置: 指定

mvwinwstr 代替ルーチンなし

文字数: すべて

ウィンドウ: 指定

位置: 指定

mvwinnwstr 代替ルーチンなし

文字数: 指定

ウィンドウ: 指定

位置: 指定

4.6    端末からの文字列の読み取り

表 4-10 のルーチンは,curses ウィンドウに対応する端末から文字列を読み取り,プログラムのバッファに格納します。

このカテゴリのインタフェースを選択する条件は,次のとおりです。

表 4-10:  ワイド文字列を端末から読み取るcursesルーチン

推奨ルーチン 代替ルーチン 動作
get_wstr getstrgetwstr

文字数: すべて

ウィンドウ: 省略時

位置: 現在

getn_wstr getnwstr

文字数: 指定

ウィンドウ: 省略時

位置: 現在

wget_wstr wgetstrwgetwstr

文字数: すべて

ウィンドウ: 指定

位置: 現在

wgetn_wstr wgetnwstr

文字数: 指定

ウィンドウ: 指定

位置: 現在

mvget_wstr mvgetstrmvgetwstr

文字数: すべて

ウィンドウ: 省略時

位置: 指定

mvgetn_wstr mvgetnwstr

文字数: 指定

ウィンドウ: 省略時

位置: 指定

mvwget_wstr mvwgetstrmvwgetwstr

文字数: すべて

ウィンドウ: 指定

位置: 指定

mvwgetn_wstr mvwgetnwstr

文字数: 指定

ウィンドウ: 指定

位置: 指定

4.7    キーボードからのワイド文字の読み取りまたはキューイング

表 4-11 のルーチンは,curses ウィンドウに対応する端末のキーボードからシングルバイト文字またはマルチバイト文字を読み取り,その文字をワイド文字フォーマットに変換して,プログラムに返します。 curses の入力モードが noecho に設定されていない場合,これらのルーチンは,すべての文字を画面上に表示します。

unget_wch インタフェースはワイド文字を入力キューの先頭に置きます。 この場合,次の wget_wch 呼び出しにより,入力キューの文字がプログラムに返されます。

このカテゴリのインタフェースを選択する条件は,次のとおりです。

表 4-11:  ワイド文字列をキーボードから読み取る curses ルーチン

推奨ルーチン 代替ルーチン 動作
get_wch getchgetwch

ウィンドウ: 省略時

位置: 現在

wget_wch wgetchwgetwch

ウィンドウ: 指定

位置: 現在

mvget_wch mvgetchmvgetwch

ウィンドウ: 省略時

位置: 指定

mvwget_wch mvwgetchmvwgetwch

ウィンドウ: 指定

位置: 指定

unget_wch ungetchungetwch

ウィンドウ: 適用外

位置: 適用外

入力キュー: 文字をキュー付け

4.8    curses ウィンドウでの書式付きテキストの変換

表 4-12 のルーチンは,curses ウィンドウからワイド文字を読み取って変換します。 これらの関数は,curses ライブラリが国際化される前から curses ライブラリに含まれており,ワイド文字データを扱えるように拡張されています。 これらの関数はすべて,wgetstr を呼び出してウィンドウからワイド文字列を読み取った後,scanf() 関数の規則に従って文字を解釈して変換します。 詳細については, scanf(3) のリファレンス・ページを参照してください。

このカテゴリのインタフェースを選択する条件は,次のとおりです。

表 4-12:  ウィンドウ内の書式付きテキストを変換する curses ルーチン

推奨ルーチン 代替ルーチン 動作
scanw 代替ルーチンなし

ウィンドウ: 省略時

位置: 現在

引数の数: 固定

wscanw 代替ルーチンなし

ウィンドウ: 指定

位置: 現在

引数の数: 固定

mvscanw 代替ルーチンなし

ウィンドウ: 省略時

位置: 指定

引数の数: 固定

mvwscanw 代替ルーチンなし

ウィンドウ: 指定

位置: 指定

引数の数: 固定

vw_scanw vwscanw

ウィンドウ: 指定

位置: 現在

引数の数: 可変

4.9    curses ウィンドウでの書式付きテキストの表示

表 4-13 のルーチンは文字列を書式付けして,curses ウィンドウに表示します。 これらの関数は curses ライブラリが国際化される前から curses ライブラリに含まれており,ワイド文字フォーマットのデータを扱えるように再定義されています。 これらの関数は,printf() (または vprintf()) と同様な形式で文字列を書式付けし,addstr() (または waddstr()) と同様な形式で文字列を書き込みます。 書式付けについては, printf(3) のリファレンス・ページを参照してください。

このカテゴリのインタフェースを選択する条件は,次のとおりです。

表 4-13:  ウィンドウに書式付きテキストを表示する curses ルーチン

推奨ルーチン 代替ルーチン 動作
printw 代替ルーチンなし

ウィンドウ: 省略時

位置: 現在

引数の数: 固定

wprintw 代替ルーチンなし

ウィンドウ: 指定

位置: 現在

引数の数: 固定

mvprintw 代替ルーチンなし

ウィンドウ: 省略時

位置: 指定

引数の数: 固定

mvwprintw 代替ルーチンなし

ウィンドウ: 指定

位置: 指定

引数の数: 固定

vw_printw vwprintw

ウィンドウ: 指定

位置: 現在

引数の数: 可変