# 制御文字

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

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

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

これらの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言語 | 説明 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `^@` | 00 | 00 | NUL | ␀ | 空白 Null | `\0` | 元々は、紙テープの末端のデータが書き込まれていない箇所をコンピュータが読み飛ばすために、「何もしない」コードとして定められたものだった。後に、テレタイプ端末がキャリッジ・リターンや行送りを物理的にするための時間を稼ぐために入れられるようにもなった。現在では、C言語などで文字列の終端を表すのに用いられる。 |
| `^A` | 01 | 01 | SOH | ␁ | ヘッディング開始 Start of Heading |  | *SOH*はベーシック手順の用語である。通信伝文中のヘッダ開始を表す。 |
| `^B` | 02 | 02 | STX | ␂ | テキスト開始 Start of Text |  | *STX*はベーシック手順の用語である。通信伝文中のテキスト部分の開始を表す。 |
| `^C` | 03 | 03 | ETX | ␃ | テキスト終結 End of Text |  | *ETX*はベーシック手順の用語である。通信伝文中のテキスト部分の終了を表す。また、Control-Cはプログラムやプロセスに割り込むためにも用いられる。 |
| `^D` | 04 | 04 | EOT | ␄ | 伝送終了 End of Transmission |  | *EOT*はベーシック手順の用語である。データ送信側がデータ送信終了時にデータ受信先にEOTを送る。 |
| `^E` | 05 | 05 | ENQ | ␅ | 問い合わせ Enquiry |  | *ENQ*はベーシック手順の用語である。データ送信側がデータ送信しようというときに、データ受信側にデータに先立ってENQを送る。データ受信先は、データ受信できる状態であればデータ送信側にACKを送り、データ受信できない状態であればNAKを送る。データ送信側はACKを受信した場合にデータを送り、NAKを受信した場合はデータ送信を断念したり時間を置いて再度ENQ送信するなどの処理を行なう。 |
| `^F` | 06 | 06 | ACK | ␆ | 肯定応答 Acknowledge |  | *ACK*はベーシック手順の用語である。受信したデータにCRCなどの異常がない場合や、ENQを受信後にデータ受信ができる状態であれば、送信側にACKを送る。 |
| `^G` | 07 | 07 | BEL | ␇ | ベル Bell | `\a` | 元々は通信相手の端末のベルを鳴らすのに使われていた。現在では物理的な鐘ではなくビープ音を鳴らす。端末エミュレータでは音を鳴らさずにウィンドウを点滅させるものもある。 |
| `^H` | 08 | 08 | BS | ␈ | 後退 Backspace | `\b` | 元々はカーソルを手前（左）に移動させ、重ね打ちをしてアクセント符号つきの文字を打ち出すために使用されていた。現在では、カーソルを手前（左）に移動させてそこの文字を削除するために用いられる。 |
| `^I` | 09 | 09 | HT | ␉ | 水平タブ Horizontal Tabulation | `\t` | 水平方向のタブ。テキストデータのデータの区切りに使うこともある。 |
| `^J` | 10 | 0A | LF | ␊ | 改行 Line Feed | `\n` | Line Feedは「行送り」の意味。タイプライターでは、カーソルを桁（水平方向）はそのままで1行下へ移動させる。UNIXでは、LF単独で改行コードとして扱われ、行送りと桁の復帰を行う。DOSやWindowsでは、CRとLFを併用する。 |
| `^K` | 11 | 0B | VT | ␋ | 垂直タブ Vertical Tabulation | `\v` | 垂直方向のタブ。 |
| `^L` | 12 | 0C | FF | ␌ | 書式送り Form Feed | `\f` | プリンタでは、次のページを給紙する。多くのプログラミング言語では空白として扱われ、コードの論理的区分の分け目として使用される。いくつかの端末エミュレータでは、画面をクリアする。プレーンテキストで記述されるRFCでは、ページ分割文字として使用される。 |
| `^M` | 13 | 0D | CR | ␍ | 復帰 Carriage Return | `\r` | 元はカーソルを同じ行の先頭の桁（左端）へ移動させるのに使われた。macOSよりも前のClassic Mac OSでは、CR単独で改行コードとして扱われ、行送りと桁の移動を行う。DOSやWindowsでは、CRとLFを併用する。 |
| `^N` | 14 | 0E | SO | ␎ | シフトアウト Shift Out |  | 別の文字コードセットに遷移する。 |
| `^O` | 15 | 0F | SI | ␏ | シフトイン Shift In |  | 通常の文字コードセットに遷移する。 |
| `^P` | 16 | 10 | DLE | ␐ | 伝送制御拡張 Data Link Escape |  | *DLE*はベーシック手順の用語である。バイナリ通信（データそのものに制御文字を含むような通信）であることを表すために使う。DLE自体をバイナリデータに含める場合はDLEを2つ重ねて送信する。データ受信側はDLEが2つ重ねられている場合は、DLEというバイナリデータ（制御文字でなく）を受信したと解釈する。こうしたことは、通常のアプリケーションでは意識しなくてもいいことが多い。しかし、プロトコルアナライザなどで通信データを表示した場合、DLEが2つ重ねられていることを知らないと、おかしな通信データと誤解しかねない。 |
| `^Q` | 17 | 11 | DC1 | ␑ | 装置制御1 Device Control 1 |  | この4つのコードは装置制御のために予約されている。コードの解釈は接続している装置に依存する。主として、DC1とDC2は装置を作動させる目的で、DC3とDC4は装置を休止または停止させる目的で使用される。実際の用法としてはDC1とDC3をソフトウェアフロー制御のために用いるのがデファクト・スタンダードとなっており、その場合、DC1はXON、DC3はXOFFと呼ばれる。テキストデータ受信側はテキスト送信側に、テキスト送信の一時停止を求めるためXOFF (DC3) を送信し、一時停止を解除するためXON (DC1) を送信する。XOFFを受信したテキストデータ送信側は、XONを受信するまでテキストデータの送信を一時停止する。なお、バイナリ通信ではDC1、DC3によるフロー制御は行なわない。バイナリ通信ではDC1、DC3は単なるバイナリデータであり、制御文字と解釈しないからである。 |
| `^R` | 18 | 12 | DC2 | ␒ | 装置制御2 Device Control 2 |  |
| `^S` | 19 | 13 | DC3 | ␓ | 装置制御3 Device Control 3 |  |
| `^T` | 20 | 14 | DC4 | ␔ | 装置制御4 Device Control 4 |  |
| `^U` | 21 | 15 | NAK | ␕ | 否定応答 Negative Acknowledge |  | *NAK*はベーシック手順の用語である。受信したデータにCRCなどの異常があった場合や、ENQを受信後にデータ受信ができる状態でないなら送信側にNAKを送る。 |
| `^V` | 22 | 16 | SYN | ␖ | 同期信号 Synchronous Idle |  | *SYN*はベーシック手順の用語である。キャラクタ同期方式の通信で、同期を取るために使う。 |
| `^W` | 23 | 17 | ETB | ␗ | 伝送ブロック終結 End of Transmission Block |  | *ETB*はベーシック手順の用語である。通信電文の1ブロック（一連のまとまりのある複数の伝文）が終了したことを表す。 |
| `^X` | 24 | 18 | CAN | ␘ | 取り消し Cancel |  | 先行するデータにエラーがある、または、無視してほしいことを示す。 |
| `^Y` | 25 | 19 | EM | ␙ | 媒体終結 End of Medium |  | 受信データを記録する媒体（紙や磁気テープなど）が、記録できる範囲の末端まで到達したことを表す。 |
| `^Z` | 26 | 1A | SUB | ␚ | 置換 Substitute Character |  | 本来は、伝送制御文字として、不明瞭な、または、無効な文字を受信したことを表す。しかし、下位レイヤで誤り検出訂正が行われるため、この用途で用いる必要はほぼなく、他の用途で用いられる。テキストファイルのファイル終端 (EOF) を表すのによく使われる。 |
| `^[` | 27 | 1B | ESC | ␛ | 拡張 Escape |  | キーボードのEscキーを押すとこの文字がシステムに送られる。ソフトウェアのユーザインターフェースでは、画面・メニュー・モードから出るのに用いられる。プリンタや端末などの装置制御プロトコルでは、後に続く文字を特別な解釈をする（エスケープシーケンス）ことを指示するために用いられる。 |
| `^\` | 28 | 1C | FS | ␜ | ファイル分離 File Separator |  | データ構造のフィールドを記録する区切り文字として使われる。階層的な構造の場合、USが最も低いレベル（プレーンテキストのデータアイテム）を分割し、 RS, GS, FSはそれぞれ下のレベルのアイテムからなるグループを分ける。 |
| `^]` | 29 | 1D | GS | ␝ | グループ分離 Group Separator |  |
| `^^` | 30 | 1E | RS | ␞ | レコード分離 Record Separator |  |
| `^_` | 31 | 1F | US | ␟ | ユニット分離 Unit Separator |  |
| `^?` | 127 | 7F | DEL | ␡ | 抹消 Delete |  | 元々は紙テープで誤って穿孔した箇所の全部のビットの穴をあけて、データを抹消するのに用いられた。現代のコンピュータでは、カーソルのすぐ右の文字を削除するのに使われる。 |

## Unicode

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

* 空白文字

* ISO IR 1（ISO 646のC0文字セット） (PDF)