6


1

端末がC1制御コードを解釈するかどうかを判断できますか?

ISO / IEC 2022では、http://en.wikipedia.org/wiki/C0_and_C1_control_codes [C0およびC1制御コード]を定義しています。 C0セットは、ASCII、ISO-8859-1、UTF-8の 0x00`と 0x1f`の間の馴染みのあるコードです(例: [.kbd] ESC#、[。kbd]#CR#、 [.kbd]#LF).

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

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

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

4 Answer


2


私が考えることができる唯一の方法は、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(http://www.catb.org/~esr/terminfo/[link])には、ユーザー文字列7および9(user7 / u7、user9 / u9)にこれらのリクエストがいくつかあります。

_ _

# INTERPRETATION OF USER CAPABILITIES
#
# The System V Release 4 and XPG4 terminfo format defines ten string
# capabilities for use by applications, ....   In this file, we use
# certain of these capabilities to describe functions which are not covered
# by terminfo.  The mapping is as follows:
#
#       u9      terminal enquire string (equiv. to ANSI/ECMA-48 DA)
#       u8      terminal answerback description
#       u7      cursor position request (equiv. to VT100/ANSI/ECMA-48 DSR 6)
#       u6      cursor position report (equiv. to ANSI/ECMA-48 CPR)
#
# The terminal enquire string  should elicit an answerback response
# from the terminal.  Common values for  will be ^E (on older ASCII
# terminals) or \E[c (on newer VT100/ANSI/ECMA-48-compatible terminals).
#
# The cursor position request () string should elicit a cursor position
# report.  A typical value (for VT100 terminals) is \E[6n.
#
# The terminal answerback description (u8) must consist of an expected
# answerback string.  The string may contain the following scanf(3)-like
# escapes:
#
#       %c      Accept any character
#       %[...]  Accept any number of characters in the given set
#
# The cursor position report () string must contain two scanf(3)-style
# %d format elements.  The first of these must correspond to the Y coordinate
# and the second to the %d.  If the string contains the sequence %i, it is
# taken as an instruction to decrement each value after reading it (this is
# the inverse sense from the cup string).  The typical CPR value is
# \E[%i%d;%dR (on VT100/ANSI/ECMA-48-compatible terminals).
#
# These capabilities are used by tac(1m), the terminfo action checker
# (distributed with ncurses 5.0).

_ _

例:

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

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


1


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

この機能をテストする通常の方法は、http://invisible-island.net/vttest/vttest.html [vttest]を使用することです。これは、8ビットコントロールを使用するために入力と出力を個別に変更するためのメニューエントリを提供します。 PuTTYはこれらの各メニューエントリの健全性チェックに失敗し、チェックが無効になっている場合、結果はPuTTYがそれらのコントロールを尊重しないことを確認します。


0


100%自動的にそれを行うことは、せいぜい難しいことです。 ほとんどではないにしても、多くのUnixインターフェイスはスマート(xtermsなど)ですが、http://bytecollector.com/asr_33.htm [ASR33]またはMSDOSを実行しているPCに接続されているかどうかは実際にはわかりません。

image:https://i.stack.imgur.com/ZhBKy.jpg [ここに画像の説明を入力]

応答がない場合は、端末調査エスケープシーケンスのいくつかを試してタイムアウトすることができます。 ただし、フォールバックして、使用している端末の種類をユーザーに尋ねる必要がある場合があります。


-1


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

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

(注:カーソルを下にするために、例の `0x84`を使用しました。 実際には、端末が使用するいずれかのエンコードでエンコードされた「U + 0084」です。 UTF-8の場合は「0xC2 0x84」。)