空白文字

スペース、タブ、改行などの不可視文字。テキスト処理やレイアウトで重要な役割を果たす。

空白文字 (ホワイトスペース) とは、画面上に目に見える形で表示されない文字の総称です。半角スペース (U+0020)、タブ (U+0009)、改行 (LF: U+000A, CR: U+000D)、全角スペース (U+3000) などが含まれます。テキストの整形、コードのインデント、データの区切りなど、あらゆるテキスト処理で重要な役割を果たしています。

Unicode には多種多様な空白文字が定義されています。一般的な半角スペースのほかに、ノーブレークスペース (U+00A0) は改行を防ぐ目的で使われ、HTML の   に対応します。全角スペース (U+3000) は日本語の組版で段落の字下げに使われます。ゼロ幅スペース (U+200B) は表示幅がゼロで、長い英数字列などの折り返し位置のヒントとして機能します。ただしこれは Unicode の分類上は空白文字 (White_Space 属性を持つ文字) ではなく書式制御用の文字で、後述する正規表現の空白指定では空白として扱われません。そのほかにも、em スペース (U+2003)、en スペース (U+2002)、thin スペース (U+2009) など、タイポグラフィ用途の空白文字が多数存在します。

CSS の white-space プロパティは HTML における空白文字の表示方法を制御します。normal では連続する空白が 1 つに縮約され自動改行されます。pre ではソースコードの空白がそのまま保持されます。nowrap では改行が抑制されます。pre-wrap は空白を保持しつつ自動改行も行う設定で、コードブロックの表示に適しています。改行だけを残して連続スペースは縮約したい場合は pre-line が使えます。なお CSS Text Module Level 4 では white-spacewhite-space-collapsetext-wrap-mode をまとめて指定する一括指定プロパティとして再定義されており、normalcollapse wrapprepreserve nowrap に相当します。従来の 4 つのキーワードはそのまま使えるため書き換えは必須ではありませんが、折り返しだけを個別に制御したいときは text-wrap-mode のような個別指定のプロパティを直接使えます。

プログラミングでは空白文字の扱いが言語によって大きく異なります。Python ではインデントに空白 (スペースまたはタブ) を使い、インデントの不一致は構文エラーになります。YAML はインデントにタブを使えず、字下げはスペースだけで書く必要があります (タブは値の中身としてなら書けます)。JSON では空白文字はフォーマットの見やすさのためだけに使われ、minify (空白除去) でサイズを削減できます。ただし削減幅は転送方式まで含めて見る必要があります。字下げ付きで 1,799 バイトの JSON を minify すると 1,007 バイトになりますが、gzip 圧縮をかけた状態では 191 バイトと 161 バイトで差はほとんど残りません (Python 3 で実測)。空白は圧縮が効きやすいため、gzip 転送が前提の API では minify の効果を過大に見積もらないほうが実態に合います。

正規表現の \s は空白文字にマッチしますが、対象となる文字の範囲は言語やエンジンによって異なります。ゼロ幅スペース (U+200B) は JavaScript でも Python でも \s にマッチしません。一方 BOM と同じ文字 (U+FEFF) は JavaScript の \s にはマッチしますが、Python の re ではマッチしません (Node.js 26 / Python 3 で実測)。ノーブレークスペース (U+00A0) と全角スペース (U+3000) はどちらの言語でもマッチします。つまり「空白を除去したのに残っている」という現象は、多くの場合その文字がエンジンの空白定義に入っていないだけです。文字が消えないときは \s に頼らず、除去したいコードポイントを明示して指定してください。

よくある注意点として、見た目では区別できない空白文字の混在があります。半角スペースと全角スペース、通常のスペースとノーブレークスペースは見た目が同じですが、プログラムでは異なる文字として扱われます。コピー&ペーストで意図しない空白文字が混入し、文字列比較が失敗する、CSV のパースがエラーになるといったトラブルは実務で頻繁に発生します。

文字数カウントとの関連では、空白文字を文字数に含めるかどうかが重要な判断ポイントです。一般的な文字数カウントでは空白を含みますが、「空白を除いた文字数」を求められる場面も多くあります。空白を含めるかどうかは媒体や発注元の規定によって変わるため、原稿の受発注では字数の取り決めと一緒に確認しておくのが確実です。一方、SNS の投稿上限では空白も 1 文字として数えられます。実務では「空白を含む」「空白を除く」の両方の値を把握し、提出先がどちらの基準なのかを先に押さえてから調整すると、書き直しの手戻りを避けられます。全角スペースや連続スペースが混ざっていると除外後の値が想定とずれるため、数える前に不要な空白を整理しておくとよいでしょう。

この記事を共有