ASCIIエスケープシーケンスと制御文字のペアは標準の一部ですか?

ASCIIエスケープシーケンスと制御文字のペアは標準の一部ですか?

エスケープシーケンスは、それぞれ ETX および SUB を使用する Ctrl-C および Ctrl-Z などの ASCII 制御文字と共通して対になっています。

ウィキペディアで制御コードページにはほとんどのペアがありますが、引用された参考文献はありません。

制御文字とキーシーケンスのペアは標準の一部ですか?

Linuxやその他のオペレーティングシステムのリストはどこにありますか?

これらのペアをリストするマニュアルページはありますか?

それは純粋に何十年もの間存在してきた暗黙の合意ですか?

引用する

  • Linuxtermios マンページ(3)リスト一部中。
  • コマンドstty -aリスト一部あなたのシステムにぴったりです。

答え1

ペアは、1から26までの「ラテン文字」(および関連する残りのASCII文字)です。

Ctrl-CETXを提供し、バイト値3(0x03、、000000011CはASCII 67(0x43、、010000011)です。ビット7(プラス/マイナス64)を反転して、あるビットから別のビットに移動します。 SUBは上記のようにバイト値26などです。あなたが言及したWikipediaのページ1~26、AZ順に並べてください。

他のC0コントロールは、Ctrlアルファベット以外の文字に対応する。 NULはASCII 64とCtrl-@同様であり、(91)はESC(27)に対応​​する式でスペースバーを押すまで続きます。@[

ASCIIコードこれらのバイトは、Unicodeや他の多くのエンコーディング標準と同様に、これらのラベルと(ある程度)意味を使用して定義されます。ビットを反転するために使用されるのはCtrl端末または入力ドライバによって決まりますが、「制御文字」という名前はペアリングの発生方法を意味します。この伝統に従うすべてのシステムでは、文字とバイトの間に同じ対応関係があります。

一方、少なくとも最新のUnixファミリーシステムでは、多くのASCIIコントロールと対応するキーシーケンスは使用されていないか、元の意図したものとは異なる目的で使用されます。実際にはまだかなり並列ですが、Ctrl-C通常アイドル状態を同期するのではなく、テキスト入力を開始するために使用されます。たとえば、私は実際にグループ区切り文字を見たことがありません。Ctrl-DCtrl-V

答え2

私は1984年にANSIコードX3.64-1979、ANSI X3.4-1977、およびANSI X3.41-1974を要約した文書を作成しました。これansicode.txt制御コードがDEC LAシリーズハードコピー端末とVTシリーズビデオ端末にどのような影響を与えるかを説明します。

答え3

法的標準化 - ない場合もあります

POSIXの一部であることを除外できます。POSIXは、完全なASCIIセットまたはASCIIエンコーディング(数値)を必要としないようにします。、このマッピングは以下に基づいています。たとえば、POSIXには言及したETX文字は必要ありません。 POSIX は、使用する文字を議論する際に、デフォルトとして Control-C/ETX または Control-Z/SUB を参照しません。INTRとSUSP、例えば。

他の人が指摘したように、Ctrlキーの動作は本質的に文字セット/文字エンコーディング定義の一部です。 CtrlキーマップがASCIIの一部として指定されていないようです。また、ANSI端末標準ファミリの一部であるようには見えません。

事実上の標準化 - VT100?

私はこの動作が以前に起こると予想しましたが、VT100 / VT102が事実上の標準になったという事実に基づいて、この動作の期待を部分的に説明できると思います。望むより」端末はどのプロトコル/標準を使用しますか?

VT102ユーザーガイドを参照してください。「テレポートされたキャラクター」->「機能キー」->「制御文字キー」。

図4-3制御文字を生成するキーを表示します。 2つの方法で制御文字を生成できます。

  • Ctrl キーを押しながら図 4-3 で、シェーディングされていないキーを押します。
  • Ctrl を使用せずに、図 4-3 で網掛けされたキーの 1 つを押します。これらの特殊キーはCtrlを使用せずに制御文字を生成します。

表4-2キーボードで生成された制御文字を一覧表示します。コンピュータシステムごとに、各制御文字を異なる方法で使用することができる。

注:VT102で生成された一部の制御文字は、以前のデジタル端末とは異なります。表4-3変更をリストします。

私はこの最後のメモが特に興味深いと思います。 VT102はNULにControl-spaceを使用し、Digitalの「旧端末」はControl-@を使用しました。また、最後の2つのC0コントロール(RSとUS)のエスケープを変更します。 (これがビット7を反転するパターンにどのように当てはまるのか疑問に思います。)VT100は制御スペースも使用します。だから、「古い端末」が次を参照しているとします。VT52家族。

Linuxカーネル

PS/2キーボードやUSBキーボードなど、さまざまなハードウェアドライバでは複製されません。彼とは対照的に、VT層。望むよりvt/keyboard.c。キーボード修飾子(Controlを含む)の状態はに保存されますshift_state。次に Shift 状態を使用してキーマップを選択します。

param.shift = shift_final = (shift_state | kbd->slockstate) ^ kbd->lockstate;
param.ledstate = kbd->ledflagstate;
key_map = key_maps[shift_final];

https://elixir.bootlin.com/linux/v4.16.8/source/drivers/tty/vt/keyboard.c#L1393

だからもっと詳しく調べるには調べてみるべきだと思います。キーマップVTレイヤーで使用されます。私はControlのキーマップがあなたが説明するペアリングを生成するように設定されていると仮定します。

これロードキーマニュアルページにはカーネルの主キーマッピングも記載されています。この内容は、マニュアルページが作成されてから移動されました。ドライバ/tty/vt/defkeymap.c_shipped。このテーブルを読むには、インデックスに使用されるLinuxキーコードを知る必要があります。 QWERTYキーボードをベースにしているため、文字がアルファベット順でも連続型でもありません。バラより/uapi/linux/input-event-codes.hを含む。またはより良い、このテーブル キーコードとデフォルトのコントロールマッピングが表示されます。

関連情報