制御文字

コンピューティングと電気通信において、制御文字（せいぎょもじ、）とは、文字コードの規格で定義される文字のうち、ディスプレイ・プリンター・通信装置などに対して、特別な動作（制御）をさせるために使う文字である。制御キャラクタともいい、情報処理用語規格では「制御機能文字」と呼ばれている。

「文字」という名前であるがディスプレイやプリンターには表示されない。そのため、非表示文字（ひひょうじもじ、、印字不可文字）とも言う。それに対し、制御文字以外の表示可能な文字を図形文字（）という。図形文字と制御文字は電気信号上は区別がなく、同じデータストリーム上に現われる。これをという。

制御文字にどのような文字コードを割り当てるかは、ASCII、EBCDICなどの文字コード体系により異なる。ASCIIでは0から31および127が制御文字に割り当てられている（技術的にはこれをという）。ISO 8859で定義される拡張ASCIIでは、これに128から159までの制御文字を追加した。これはと呼ばれる。

これらの65個の制御文字はUnicodeに引き継がれた。Unicodeではさらに制御文字を追加しているが、これはゼロ幅非接合子のようなフォーマット用文字とは区別される。

EBCDICには、ASCIIの65個の制御文字全てのほか、主としてIBMの周辺機器を制御するための追加の制御文字が含まれている。

 0x00 0x10 0x00 NUL DLE 0x01 SOH DC1 0x02 STX DC2 0x03 ETX DC3 0x04 EOT DC4 0x05 ENQ NAK 0x06 ACK SYN 0x07 BEL ETB 0x08 BS CAN 0x09 TAB EM 0x0A LF SUB 0x0B VT ESC 0x0C FF FS 0x0D CR GS 0x0E SO RS 0x0F SI US 0x7F DEL

歴史

モールス符号のは、制御文字の一形態と言える。

1870年に制定されたBaudot Codeで、最初の制御文字 NUL と DEL が導入された。1901年にドナルド・マレーがキャリッジ・リターン (CR) とラインフィード (LF) を追加することを提案するなど、Baudot Codeには様々な制御文字が追加された。ベル文字は送信相手のベルを鳴らしてオペレータに通知するための文字で、初期のテレタイプ端末で追加された。

表現法
制御文字自体は表示できない文字であるため、それを別の方法で表現する必要がある。以下に、ASCIIのベル文字での例を示す。
 符号点: 十進法 7、十六進法 0x07
 略号（通常は3文字の大文字）: BEL
 略号で表した表示用の図形文字: Unicode U+2407 (␇), "symbol for bell"
 ISO 2047で定められた制御文字の記号: Unicode U+237E (⍾), "graphic for bell"
 キャレット記法（00xxxxxで表される制御文字について、10xxxxxの位置にある大文字のラテン文字とキャレットで表す方法）: ^G
 エスケープシーケンス（C言語などのprintf文で用いられる）: \a

ASCII
ASCIIの制御文字には以下のものを含む。

 CS 10進 16進 略号 記号 名称 C言語 説明^@0000NUL空白 Null \0 元々は、紙テープの末端のデータが書き込まれていない箇所をコンピュータが読み飛ばすために、「何もしない」コードとして定められたものだった。後に、テレタイプ端末がキャリッジ・リターンや行送りを物理的にするための時間を稼ぐために入れられるようにもなった。現在では、C言語などで文字列の終端を表すのに用いられる。^A0101SOHヘッディング開始Start of Heading 通信伝文中のヘッダ開始を表す。^B0202STXテキスト開始Start of Text 通信伝文中のテキスト部分の開始を表す。^C0303ETXテキスト終結End of Text 通信伝文中のテキスト部分の終了を表す。また、Control-Cはプログラムやプロセスに割り込むためにも用いられる。^D0404EOT伝送終了End of Transmission データ送信側がデータ送信終了時にデータ受信先にEOTを送る。^E0505ENQ問い合わせEnquiry データ送信側がデータ送信しようというときに、データ受信側にデータに先立ってENQを送る。データ受信先は、データ受信できる状態であればデータ送信側にACKを送り、データ受信できない状態であればNAKを送る。データ送信側はACKを受信した場合にデータを送り、NAKを受信した場合はデータ送信を断念したり時間を置いて再度ENQ送信するなどの処理を行なう。^F0606ACK肯定応答Acknowledge 受信したデータにCRCなどの異常がない場合や、ENQを受信後にデータ受信ができる状態であれば、送信側にACKを送る。^G0707BELベルBell\a 元々は通信相手の端末のベルを鳴らすのに使われていた。現在では物理的な鐘ではなくビープ音を鳴らす。端末エミュレータでは音を鳴らさずにウィンドウを点滅させるものもある。^H0808BS 後退Backspace\b 元々はカーソルを手前（左）に移動させ、重ね打ちをしてアクセント符号つきの文字を打ち出すために使用されていた。現在では、カーソルを手前（左）に移動させてそこの文字を削除するために用いられる。^I0909HT 水平タブHorizontal Tabulation\t 水平方向のタブ。テキストデータのデータの区切りに使うこともある。^J100ALF 改行Line Feed\nLine Feedは「行送り」の意味。タイプライターでは、カーソルを桁（水平方向）はそのままで1行下へ移動させる。UNIXでは、LF単独で改行コードとして扱われ、行送りと桁の復帰を行う。MS-DOSやWindowsでは、CRとLFを併用する。^K110BVT 垂直タブVertical Tabulation\v 垂直方向のタブ。^L120CFF 書式送りForm Feed\f プリンタでは、次のページを給紙する。多くのプログラミング言語では空白として扱われ、コードの論理的区分の分け目として使用される。いくつかの端末エミュレータでは、画面をクリアする。プレーンテキストで記述されるRFCでは、文字として使用される。^M130DCR 復帰Carriage Return\r 元はカーソルを同じ行の先頭の桁（左端）へ移動させるのに使われた。macOSよりも前のClassic Mac OSでは、CR単独で改行コードとして扱われ、行送りと桁の移動を行う。MS-DOSやWindowsでは、CRとLFを併用する。^N140ESO シフトアウトShift Out 別の文字コードセットに遷移する。^O150FSI シフトインShift In 通常の文字コードセットに遷移する。^P1610DLE伝送制御拡張Data Link Escape バイナリ通信（データそのものに制御文字を含むような通信）であることを表すために使う。DLE自体をバイナリデータに含める場合はDLEを2つ重ねて送信する。データ受信側はDLEが2つ重ねられている場合は、DLEというバイナリデータ（制御文字でなく）を受信したと解釈する。こうしたことは、通常のアプリケーションでは意識しなくてもいいことが多い。しかし、プロトコルアナライザなどで通信データを表示した場合、DLEが2つ重ねられていることを知らないと、おかしな通信データと誤解しかねない。^Q1711DC1装置制御1Device Control 1 この4つのコードは装置制御のために予約されている。コードの解釈は接続している装置に依存する。主として、DC1とDC2は装置を作動させる目的で、DC3とDC4は装置を休止または停止させる目的で使用される。実際の用法としてはDC1とDC3をのために用いるのがデファクト・スタンダードとなっており、その場合、DC1はXON、DC3はXOFFと呼ばれる。テキストデータ受信側はテキスト送信側に、テキスト送信の一時停止を求めるためXOFF (DC3) を送信し、一時停止を解除するためXON (DC1) を送信する。XOFFを受信したテキストデータ送信側は、XONを受信するまでテキストデータの送信を一時停止する。なお、バイナリ通信ではDC1、DC3によるフロー制御は行なわない。バイナリ通信ではDC1、DC3は単なるバイナリデータであり、制御文字と解釈しないからである。^R1812DC2装置制御2Device Control 2^S1913DC3装置制御3Device Control 3^T2014DC4装置制御4Device Control 4^U2115NAK否定応答Negative Acknowledge 受信したデータにCRCなどの異常があった場合や、ENQを受信後にデータ受信ができる状態でないなら送信側にNAKを送る。^V2216SYN同期信号Synchronous Idle キャラクタ同期方式の通信で、同期を取るために使う。^W2317ETB伝送ブロック終結End of Transmission Block 通信電文の1ブロック（一連のまとまりのある複数の伝文）が終了したことを表す。^X2418CAN取り消しCancel 先行するデータにエラーがある、または、無視してほしいことを示す。^Y2519EM 媒体終結End of Medium 受信データを記録する媒体（紙や磁気テープなど）が、記録できる範囲の末端まで到達したことを表す。^Z261ASUB置換Substitute Character 本来は、伝送制御文字として、不明瞭な、または、無効な文字を受信したことを表す。しかし、下位レイヤで誤り検出訂正が行われるため、この用途で用いる必要はほぼなく、他の用途で用いられる。テキストファイルのファイル終端 (EOF) を表すのによく使われる。^[271BESC拡張Escape キーボードのEscキーを押すとこの文字がシステムに送られる。ソフトウェアのユーザインターフェースでは、画面・メニュー・モードから出るのに用いられる。プリンタや端末などの装置制御プロトコルでは、後に続く文字を特別な解釈をする（エスケープシーケンス）ことを指示するために用いられる。^\281CFS ファイル分離File Separator データ構造のフィールドを記録する区切り文字として使われる。階層的な構造の場合、USが最も低いレベル（プレーンテキストのデータアイテム）を分割し、 RS, GS, FSはそれぞれ下のレベルのアイテムからなるグループを分ける。^]291DGS グループ分離Group Separator^^301ERS レコード分離Record Separator^_311FUS ユニット分離Unit Separator^?1277FDEL抹消Delete 元々は紙テープで誤って穿孔した箇所の全部のビットの穴をあけて、データを抹消するのに用いられた。現代のコンピュータでは、カーソルのすぐ右の文字を削除するのに使われる。

Unicode

Unicodeでは、制御文字は U+0000 - U+001F（C0制御コード）、U+007F（削除文字）、 U+0080 - U+009F（C1制御コード）である。これらのの名前は"Cc"である。フォーマット用コードはこれと区別して、一般カテゴリは"Cf"である。Ccの制御文字はUnicodeでは名前がついておらず、正式には"<control-001A>"のように表示される。