6

ISO/IEC 2022 では、C0 および C1 制御コードが定義されています。C0 セットは、 ASCII、ISO-8859-1、および UTF-8 の間のよく知られたコードです (0x00例: 、) 。0x1fESCCRLF

一部の VT100 端末エミュレータ ( screen(1)PuTTY など) も C1 セットをサポートしています。これらは と の間の値です0x80(つまり0x9f、たとえば、0x84カーソルを 1 行下に移動します)。

ユーザー提供の入力を表示しています。ユーザー入力で端末の状態を変更できるようにしたくありません (カーソルの移動など)。現在、C0 セットの文字コードを除外しています。ただし、端末がそれらを制御コードとして解釈する場合は、C1セットも条件付きで除外したいと思います。

のようなデータベースからこの情報を取得する方法はありますtermcapか?

4

4 に答える 4

3

私が考えることができる唯一の方法は、C1 リクエストを使用して戻り値をテストすることです。

$ echo `echo -en "\x9bc"`
^[[?1;2c
$ echo `echo -e "\x9b5n"`
^[[0n
$ echo `echo -e "\x9b6n"`
^[[39;1R
$ echo `echo -e "\x9b0x" `
^[[2;1;1;112;112;1;0x

上記のものは次のとおりです。

CSI c      Primary DA; request Device Attributes
CSI 5 n    DSR; Device Status Report
CSI 6 n    CPR; Cursor Position Report
CSI 0 x    DECREQTPARM; Request Terminal Parameters

ESR が管理する terminfo/termcap (リンク) には、ユーザー文字列 7 と 9 (user7/u7、user9/u9) にこれらの要求がいくつかあります。

# ユーザー機能の解釈
#
# System V Release 4 および XPG4 terminfo フォーマットは、10 個の文字列を定義します
# アプリケーションが使用する機能 .... このファイルでは、
# カバーされていない機能を記述するこれらの機能の特定
#terminfoによる。マッピングは次のとおりです。
#
# u9 端末問い合わせ文字列 (ANSI/ECMA-48 DA 相当)
# u8端末のアンサーバックの説明
# u7 カーソル位置リクエスト (VT100/ANSI/ECMA-48 DSR 6 相当)
# u6 カーソル位置レポート (ANSI/ECMA-48 CPR と同等)
#
# 端末の照会文字列は、アンサーバック応答を引き出す必要があります
# ターミナルから。の一般的な値は ^E になります (古い ASCII では
# 端末) または \E[c (新しい VT100/ANSI/ECMA-48 互換端末の場合)。
#
# カーソル位置リクエスト () 文字列は、カーソル位置を引き出す必要があります
# 報告。典型的な値 (VT100 端末の場合) は \E[6n です。
#
# 端末のアンサーバックの説明 (u8) は、予想される
# 回答文字列。文字列には次の scanf(3) のようなものが含まれる場合があります
# エスケープ:
#
# %c 任意の文字を受け入れる
# %[...] 指定されたセット内の任意の数の文字を受け入れます
#
# カーソル位置レポート () 文字列には、2 つの scanf(3) スタイルが含まれている必要があります
# %d フォーマット要素。これらの最初のものは Y 座標に対応する必要があります
# と %d の 2 番目。文字列にシーケンス %i が含まれている場合、それは
# 読み取り後に各値をデクリメントする命令と見なされます (これは
# カップ ストリングからの逆の意味)。典型的な CPR 値は
# \E[%i%d;%dR (VT100/ANSI/ECMA-48 互換端末)。
#
# これらの機能は、terminfo アクション チェッカーである tac(1m) によって使用されます。
# (ncurses 5.0 で配布)。

例:

$ echo `tput u7`
^[[39;1R
$ echo `tput u9`
^[[?1;2c

もちろん、表示の破損だけを防ぎたい場合は、lessアプローチを使用して、制御文字の表示/非表示をユーザーに切り替えさせることができます ( の -r および -R オプションless)。また、出力文字セットがわかっている場合、ISO-8859 文字セットには制御コード用に予約された C1 範囲があります (したがって、その範囲には印刷可能な文字がありません)。

于 2010-11-08T22:47:50.493 に答える
1

実際、PuTTY は C1 コントロールをサポートしていないようです。

この機能をテストする通常の方法は、vttestを使用することです。これは、入力と出力を個別に変更して 8 ビット コントロールを使用するためのメニュー エントリを提供します。PuTTY はこれらの各メニュー エントリのサニティ チェックに失敗し、チェックが無効になっている場合は、PuTTY がこれらのコントロールを尊重していないことが確認されます。

于 2015-03-11T21:14:48.753 に答える
0

端末がそれらをサポートしているかどうかを照会する簡単な方法はないと思います。厄介な回避策 (印刷してからカーソル位置を照会するなど) を試すことはできますが、これらの行に沿って何もお勧めしません。

これらの C1 コードを無条件に除外できると思います。とにかく、UnicodeはU + 0080.. U + 009Fの範囲を制御文字として宣言しています。それらを別の目的で使用するべきではないと思います。

(注:0x84カーソルを下に移動する例を使用しました。実際には、 UTF-8U+0084など、端末が使用するエンコードでエンコードされています。)0xC2 0x84

于 2015-04-22T21:00:22.643 に答える