制御文字
画面に表示されないが、テキストの処理方法を指示する特殊な文字。改行 (LF)、タブ (HT)、キャリッジリターン (CR)、ヌル文字 (NUL) などが含まれる。
制御文字 (control character) は、文字として表示されるのではなく、テキストの処理や表示を制御するために使われる特殊な文字です。ASCII の最初の 32 文字 (U+0000〜U+001F) と DEL (U+007F) が制御文字に分類されます。Unicode ではさらに U+0080〜U+009F の範囲にも制御文字が定義されています。
日常的に使われる制御文字は限られています。LF (Line Feed、U+000A) は改行を表し、UNIX 系 OS の標準改行コードです。CR (Carriage Return、U+000D) はカーソルを行頭に戻す文字で、Windows では CR+LF の 2 文字で改行を表します。HT (Horizontal Tab、U+0009) はタブ文字で、テキストの桁揃えに使われます。NUL (U+0000) はヌル文字で、C 言語では文字列の終端を示します。
文字数カウントにおいて、制御文字の扱いは混乱の原因になります。テキストエディタで「改行」を入力すると、見た目には行が変わるだけですが、内部的には LF (1 バイト) または CR+LF (2 バイト) が挿入されています。Windows で作成したテキストファイルの文字数を数えると、改行 1 つにつき 2 文字 (CR+LF) がカウントされ、UNIX で作成した同じ内容のファイルより文字数が多くなります。
ウェブの文脈では、HTML は連続する空白文字 (スペース、タブ、改行) を 1 つのスペースに圧縮して表示します。そのため、HTML ソースコード上の文字数と、ブラウザに表示されるテキストの文字数は一致しません。<pre> 要素や CSS の white-space: pre を使うと、制御文字を含む空白がそのまま表示されます。
セキュリティの観点では、制御文字はインジェクション攻撃の手段になり得ます。HTTP ヘッダに CR+LF を挿入する「HTTP ヘッダインジェクション」や、ログファイルに改行を挿入して偽のログエントリを作る「ログインジェクション」が知られています。ユーザー入力から制御文字を除去するサニタイズ処理は、セキュリティ対策の基本です。
Unicode には、制御文字に加えて「フォーマット文字」というカテゴリもあります。ゼロ幅スペース (U+200B)、ゼロ幅接合子 (U+200D)、双方向制御文字 (U+200E、U+200F) などがこれに該当します。これらは制御文字と同様に不可視ですが、テキストの表示方法に影響を与えるため、文字数カウントでの扱いを明確にする必要があります。