コンピューティングおよび電気通信において、制御文字または非印刷文字( NPC ) は、文字セット内のコード ポイントであり、書かれた文字や記号を表しません。これらは、テキストに記号を追加する以外の効果を引き起こすためのインバンド信号として使用されます。他のすべての文字は、おそらく「スペース」文字を除いて、主にグラフィック文字、つまり印刷文字(または印刷可能文字)として知られています。ASCII標準には、コード 7、 BELなど、33 の制御文字があります[ 1 ]。これは聞き覚えがあるかもしれません。
1870年のボードコードでは、制御文字の一種であるNULとDELが導入された。1901年のマレーコードでは、キャリッジリターン(CR)とラインフィード(LF)が追加され、ボードコードの他のバージョンでは、さらに別の制御文字が追加された。
オペレーターに警告するためにベルを鳴らすベル文字(BEL)は、初期のテレタイプ制御文字でもあった。
一部の制御文字は「フォーマットエフェクター」とも呼ばれています。

制御文字はかなり多く定義されていました(ASCIIでは33個、ECMA-35ではさらに32個追加されています)。これは、初期の端末は非常に原始的な機械的または電気的な制御しか備えていなかったため、状態を記憶するAPIを実装するにはコストがかかりすぎたため、各機能ごとに異なるコードが必要だったからです。ASCIIテーブルのコード32 10(厳密にはC0制御コードセット)より下のエントリはすべて制御文字で、テキスト行を区切るために使用されるCRとLFも含まれます。コード127 10(DEL)も制御文字です。[ 2 ] [ 3 ]
ECMA-35およびISO 8859で定義された拡張ASCIIセットでは、制御文字としてコード128 10から159 10が追加されました。これは主に、最上位ビットが削除された場合でも、印刷文字がC0制御コードに変わってしまうことを防ぐためです。この2番目のセットはC1セットと呼ばれます。
IBMのEBCDIC文字セットには、ASCIIのC0制御コードすべてに加え、Unicodeには追加されなかった追加のコードを含む、65個の制御コードが含まれています。また、32個の制御コードからなる代替セットを定義しようとする試みもいくつかありましたが、いずれもUnicodeには採用されませんでした。
制御文字のうち、本来の目的に近い用途で現在も使用されているのはごく一部に過ぎない。
制御文字は、ユーザーが入力すると何らかの動作を実行する場合があります。例えば、Ctrl+C(テキスト終了文字、ETX)は実行中のプロセスを中断し、Ctrl+Z(置換文字、SUB)はWindowsで入力したファイルの終了を実行します。これらの用途は、通常、ASCIIコードとはほとんど関係がありません。現代のシステムでは、ショートカットを制御文字であるかのように説明することがよくあります(「Ctrl+Vを入力して貼り付けてください」など)が、実際にはコード番号は使用されていません。
これらの 65 個の制御コードはUnicodeに引き継がれました。「制御文字」は U+0000 — U+001F (C0 制御)、U+007F (削除)、および U+0080 — U+009F (C1 制御) です。それらの一般カテゴリは「Cc」です。Cc 制御文字には Unicode で名前はありませんが、代わりに「<control-001A>」などのラベルが付けられています。[ 6 ]
Unicodeは、制御文字とみなせる文字(例えば、幅ゼロの非結合子など)をさらに追加しましたが、これらの「書式設定文字」と65個の制御文字を区別しています。これらは「Cc」ではなく「Cf」という一般カテゴリに分類されます。
ASCII ベースのキーボードには、「Control」、「Ctrl」、または (まれに)「Cntl」とラベル付けされたキーがあり、シフト キーのように、他の文字または記号キーと組み合わせて使用されます。ある実装では、コントロール キーは、組み合わせて押された (通常は) 大文字の文字のコードより 64 桁下のコードを生成します (つまり、(通常は) 大文字の文字の ASCII コード値から 0x40 を減算します)。別の実装では、キーによって生成された ASCII コードを取得し、 0x1F とビットごとの AND演算を行い、ビット 5 から 7 をゼロにします。たとえば、「control」と文字「g」(バイナリでは 0110 0111 )を押すと、コード 7 (10 進数では BELL 7、バイナリでは 0000 0111) が生成されます。NULL 文字 (コード 0) は Ctrl-@ で表され、「@」は ASCII 文字セットで「A」の直前のコードです。便宜上、一部の端末ではCtrl-SpaceをCtrl-@のエイリアスとして受け入れます。どちらの場合も、0から31までの32個のASCII制御コードのいずれかが生成されます。テーブル内での特別な位置と値(コード127 10)のため、どちらの方法でもDEL文字を生成することはできません。この文字にはCtrl-?が使用されることがあります。[ 7 ]
コントロール キーが押されている間は、 Shift キーやCaps Lockキーの状態に関係なく、文字キーは同じ制御文字を生成します。つまり、そのキーが大文字を生成するか小文字を生成するかは関係ありません。スペース キー、グラフィック 文字 キー、数字キー (ASCII コード 32 ~ 63) でのコントロール キーの解釈は、システムによって異なります。コントロール キーが押されていない場合と同じ文字コードを生成するシステムもあれば、コントロール キーが押されているときにこれらのキーを制御文字に変換するシステムもあります。非 ASCII (「外国語」) キーでのコントロール キーの解釈も、システムによって異なります。
制御文字は、キャレット記号(^)の後に、その制御文字の値に64を加えたASCII文字を続けて表示することで、キャレット表記と呼ばれる印刷可能な形式に変換されることがよくあります。文字キーを使用して生成された制御文字は、大文字で表示されます。たとえば、^Gはコード7を表します。これは、制御キーを押しながらGキーを押すことで生成されます。
キーボードには通常、制御文字コードを生成する単一のキーがいくつかあります。たとえば、「バックスペース」とラベル付けされたキーは通常コード8を生成し、「タブ」はコード9を、「エンター」または「リターン」はコード13を生成します(ただし、一部のキーボードでは「エンター」がコード10を生成する場合があります)。
多くのキーボードには、ASCIIの印刷可能文字や制御文字に対応しないキーが含まれています。たとえば、カーソル制御矢印やワードプロセッサ機能などです。関連するキー押下は、次の4つの方法のいずれかによってコンピュータプログラムに伝達されます。未使用の制御文字を流用する、ASCII以外のエンコーディングを使用する、複数文字の制御シーケンスを使用する、または文字生成以外の追加メカニズムを使用する。「ダム」コンピュータ端末は通常、制御シーケンスを使用します。1980年代に製造されたスタンドアロンのパーソナルコンピュータに接続されたキーボードは、通常、最初の2つの方法のいずれか(または両方)を使用します。最新のコンピュータキーボードは、押された特定の物理キーを識別するスキャンコードを生成します。コンピュータソフトウェアは、押されたキーをどのように処理するかを決定します。これには、上記4つの方法のいずれかが含まれます。
制御文字は、印刷および表示制御、データ構造化、伝送制御、その他といったいくつかのグループに分類されるように設計されました。
印刷制御文字は、当初、最も初期の出力装置であるプリンタの物理的な機構を制御するために使用されました。このアイデアの初期の例としては、ボードコードで数字(FIGS)と文字(LTRS)を使用して2つのコードページを切り替えることが挙げられます。後期の例では、 ASAの帯域外キャリッジ制御文字が挙げられます。その後、制御文字は印刷されるデータストリームに組み込まれるようになりました。キャリッジリターン文字(CR)がこのような装置に送信されると、文字は用紙の端、つまり書き込み開始位置に配置されます(印刷位置が次の行に移動する場合と移動しない場合があります)。ラインフィード文字(LF/NL)は、印刷位置を次の行に配置します。装置とその構成によっては、印刷位置が次の行の先頭に移動する場合と移動しない場合があります(これは、西洋言語で使用されるアルファベットのような左から右に書く文字体系の場合は左端の位置、ヘブライ語やアラビア語のアルファベットのような右から左に書く文字体系の場合は右端の位置になります)。縦タブ文字と横タブ文字 (VT と HT/TAB) は、出力装置に印刷位置を読み方向の次のタブストップに移動させます。フォームフィード文字 (FF/NP) は新しい用紙を開始し、最初の行の先頭に移動する場合と移動しない場合があります。バックスペース文字 (BS) は、印刷位置を 1 文字分後ろに移動させます。ハードコピー端末を含むプリンタでは、これは通常、プリンタが文字を上書きして、通常使用できない他の文字を作成するために使用されます。ビデオ端末やその他の電子出力デバイスでは、多くの場合、消去する破壊的バックスペース (BS、SP、BS シーケンスなど) と、消去しない非破壊的バックスペースを許可するソフトウェア (またはハードウェア) 構成オプションがあります。シフトイン文字とシフトアウト文字 (SI と SO) は、代替文字セット、フォント、下線、またはその他の印刷モードを選択します。エスケープシーケンスは、同じことを行うためによく使用されました。
紙に物理的に印刷しないコンピュータ端末の登場により、画面上の配置や消去などに関してより柔軟性が高まり、印刷制御コードが適応されました。たとえば、フォームフィードは通常、新しい用紙ページがないため画面をクリアします。新しい端末、そして実際には新しいプリンタの柔軟性を活用するために、より複雑なエスケープシーケンスが開発されました。制御文字の概念は常に多少の制約がありましたが、新しい、はるかに柔軟なハードウェアで使用されると、その制約は極めて大きくなりました。制御シーケンス(エスケープシーケンスとして実装されることもあります)は、新しい柔軟性とパワーに対応でき、標準的な方法となりました。しかし、当時も今も、選択できる標準シーケンスは多種多様です。
セパレータ(ファイル、グループ、レコード、ユニット:FS、GS、RS、US)は、パンチカードをシミュレートするために、通常はテープ上のデータを構造化するために作成されました。メディア終了(EM)は、テープ(またはその他の記録媒体)の終了を警告します。多くのシステムでは、データの構造化にCR/LFとTABを使用しますが、構造化が必要なデータでセパレータ制御文字に遭遇する可能性があります。セパレータ制御文字はオーバーロードされていません。構造化されたグループにデータを分割する以外に、一般的な用途はありません。これらの数値はスペース文字と連続しており、スペース文字はグループのメンバーとして、ワードセパレータとして考えることができます。
例えば、RS区切り文字はRFC 7464(JSONテキストシーケンス)でJSON要素のシーケンスをエンコードするために使用されます。各シーケンス項目はRS文字で始まり、改行文字で終わります。これにより、オープンエンドのJSONシーケンスをシリアル化できます。これはJSONストリーミングプロトコルの1つです。
伝送制御文字は、データストリームを構造化し、伝送エラーが発生した場合に必要に応じて再送信や正常な障害処理を管理することを目的としていました。
ヘッダー開始文字 (SOH) は、データ ストリームの非データ セクション、つまりアドレスやその他の管理データを含むストリームの部分を示すために使用されました。テキスト開始文字 (STX) は、ヘッダーの終了とストリームのテキスト部分の開始を示しました。テキスト終了文字 (ETX) は、メッセージのデータの終了を示しました。エラー検出のために、ETX の前の 2 文字をチェックサムまたはCRCにするという慣例が広く用いられています。送信ブロック終了文字 (ETB) は、送信のためにデータがブロックに分割された場合、そのブロックの終了を示すために使用されました。
エスケープ文字(ESC)は、次の文字を「引用符」として扱うことを目的としていました。もしそれが別の制御文字であれば、制御機能を実行する代わりにその文字をそのまま表示します。しかし、今日ではこの目的で使用されることはほとんどありません。状況に応じて、様々な印刷可能な文字が「エスケープ文字」として使用されます。
置換文字(SUB)は、次の文字を印刷可能な文字から別の値に変換することを要求するもので、通常はビット5をゼロに設定することで実現されます。これは、タイプライターで作成された用紙など、印刷可能な文字しか送信できないメディアがあるため便利です。しかし、テキストモードでファイルを開いたMS-DOSシステムでは、他のオペレーティングシステムで一般的なCtrl-CやCtrl-Dではなく、このCtrl-Z文字で「テキストの終わり」または「ファイルの終わり」が示されます。
キャンセル文字(CAN)は、前の要素を破棄する必要があることを示していました。否定応答文字(NAK)は、通常、受信に問題があったことを示す明確なフラグであり、多くの場合、現在の要素を再送信する必要があることを示しています。承認文字(ACK)は、通常、現在の要素に問題が検出されなかったことを示すフラグとして使用されます。
伝送媒体が半二重(つまり、一度に一方向のみ送信可能)の場合、通常はいつでも送信できるマスター局と、許可を得たときに送信する1つ以上のスレーブ局があります。問い合わせ文字(ENQ)は、一般的にマスター局がスレーブ局に次のメッセージを送信するように要求するために使用されます。スレーブ局は、送信終了文字(EOT)を送信することで、送信が完了したことを示します。
デバイス制御コード(DC1~DC4)は元々汎用的なもので、各デバイスが必要に応じて実装することになっていました。しかし、データ伝送において普遍的に必要とされるのは、受信側が一時的にこれ以上データを受け入れられなくなったときに、送信側に送信停止を要求することです。デジタル・イクイップメント・コーポレーション(DEC)は、送信停止に19(デバイス制御3文字(DC3)、別名制御SまたはXOFF)を使用し、送信開始に17(デバイス制御1文字(DC1)、別名制御QまたはXON)を使用するという慣例を考案しました。この慣例は非常に広く普及したため、公式ASCIIの一部ではないことに気づいている人はほとんどいません。この手法は、実装方法に関わらず、データケーブル内で送信管理専用の配線を省略できるため、コスト削減につながります。ただし、デッドロック状態を回避するためには、このような送信フロー制御信号を使用するための適切なプロトコルを用いる必要があります。
データリンクエスケープ文字(DLE)は、次の文字がSTXやETXなどの制御文字であることをデータリンクの相手側に伝えるための信号として意図されていました。例えば、パケットは次のように構成されます。(DLE)<STX> <PAYLOAD>(DLE)<ETX>。
コード7(BEL)は、受信端末で可聴信号を発生させることを目的としています。[ 8 ]
ASCII制御文字の多くは、当時使用されていた機器向けに設計されたもので、今日ではあまり見かけません。例えば、コード22「同期アイドル」(SYN)は、送信するデータが実際にはない場合に、同期モデム(常にデータを送信する必要がある)によって送信されていました。(現代のシステムでは、通常、送信ワードの開始を示すためにスタートビットを使用します。これは非同期通信 の特徴です。同期通信リンクは、メインフレームでより頻繁に見られ、通常は企業専用線を介してメインフレーム同士、あるいはミニコンピュータと接続されていました。)
コード0(ASCIIコード名NUL)は特殊なケースです。紙テープでは、穴が開いていない状態を指します。これは、それ以外の意味を持たない埋め文字として扱うのが便利です。NUL文字の位置には穴が開いていないため、後で他の文字に置き換えることができます。そのため、通常はエラーの修正や、後で別の場所または別の場所で利用できる情報を挿入するためのスペースを確保するために使用されていました。コンピュータでは、固定長レコードのパディング、文字列の末尾のマーク、そしてかつては印刷装置が制御機能を実行するのに十分な時間を与えるためによく使用されていました。
コード127(DEL、別名「消去」)も同様に特殊なケースです。その7ビットコードはバイナリで全ビットオンであり、オーバーパンチすると紙テープ上の文字セルを消去する効果がありました。ASCIIが開発された当時、紙テープは一般的な記憶媒体であり、その歴史は第二次世界大戦中の暗号解読装置(Biuro Szyfrów)にまで遡ります。紙テープは1970年代に廃れてしまったため、ASCIIのこの側面はそれ以降ほとんど使われることはありませんでした。一部のシステム(初代Appleコンピュータなど)では、これをバックスペースに変換していました。しかし、そのコードが他の印刷可能な文字と同じ範囲にあり、公式に割り当てられたグリフもなかったため、多くのコンピュータ機器ベンダーはこれを追加の印刷可能な文字(多くの場合、インクでオーバープリントしてテキストを消去するのに役立つ真っ黒なボックス文字)として使用していました。
消去不可能なプログラマブルROMは、通常、各ビットを表すヒューズ素子の配列として実装され、ビットは通常1から0への一方通行でしか切り替えることができません。このようなPROMでは、DEL文字とNUL文字は、パンチテープで使用されていたのと同じように使用できます。つまり、DELは後で書き込める無意味なフィルバイトを予約するために使用され、NULは書き込まれたバイトを無意味なフィルバイトに変換するために使用されます。1から0に切り替えるPROMでは、NULとDELの役割が逆になります。また、DELは7ビット文字でのみ機能しますが、7ビット文字は現在ではほとんど使用されていません。8ビットの内容の場合は、DELの代わりに、一般的に改行なしスペース文字として定義されている文字コード255を使用できます。
多くのファイルシステムでは、ファイル名に制御文字を使用することを許可していません。これは、制御文字が予約済みの機能を持つ可能性があるためです。
EOT 文字は現在の送信を終了し、データ リンク内のすべての端末を制御モードに戻します。送信端末から送信されると、端末が送信するものがもうなく、通信回線を解放していることを示します。受信端末は、通常の DLE 0、DLE 1、または NAK 応答の代わりに EOT 文字を送信できます。この場合の EOT 文字は、送信を終了する中止信号です。ポーリング操作に応答して EOT 文字が送信されると、ポーリングされた端末が送信するデータがないか、送信を継続できないことを示します。 EOT 文字は、(6 ビット トランスコードの場合を除く) SYN パターン (SYN SYN EOT PAD) が直前にある場合、または DLE が直前にあり、最初の 4 ビットがすべて「1」である文字 (PAD 文字) が直後にある場合にのみ認識されます。DLE EOT PAD。