ホワイトスペース文字の全種類
目に見えない「空白っぽい文字」は数十種類あります。MDNとUnicode仕様に沿って分類します。
参照した一次情報
- ・MDN「white-space CSSプロパティ」(developer.mozilla.org/ja/docs/Web/CSS/white-space)
- ・Unicode Standard「White_Space property」(PropList.txt)
- ・W3C「CSS Text Module Level 3」(white-space処理仕様)
3つのカテゴリ
ホワイトスペース文字は、その性質から大きく3つに分けられます。
- ・表示空白:半角空白(U+0020)・全角空白(U+3000)・タブ(U+0009)
- ・改行系:LF(U+000A)・CR(U+000D)・CR+LF・LS(U+2028)・PS(U+2029)
- ・不可視・特殊:ゼロ幅スペース(U+200B)・BOM(U+FEFF)・非改行スペース(U+00A0)など
主要ホワイトスペース一覧
| コード | 名称 | 特徴・混入元 |
|---|---|---|
| U+0020 | SPACE(半角) | 普通の半角空白 |
| U+3000 | IDEOGRAPHIC SPACE(全角) | 日本語入力中の変換キー由来 |
| U+0009 | TAB | Excel・コードエディタ由来 |
| U+000A | LF(改行) | UNIX標準改行 |
| U+000D | CR | 旧Mac/Windows CRLFの一部 |
| U+00A0 | NO-BREAK SPACE | Web由来。改行禁止だが見た目は空白 |
| U+200B | ZERO WIDTH SPACE | 完全に不可視。SNS・コピペで混入 |
| U+200D | ZERO WIDTH JOINER | 絵文字結合に使用 |
| U+FEFF | BOM(バイト順マーク) | UTF-8の先頭やExcel CSV由来 |
| U+2028 | LINE SEPARATOR | Word・InDesign由来の改行 |
CSS white-spaceプロパティの扱い
MDN CSS white-spaceプロパティは「ホワイトスペースをどう扱うか」を制御します。デフォルト値normalでは、連続するホワイトスペースが1つにまとめられ、改行はテキストを自動折り返しする条件として扱われます。
- ・
normal:連続空白を1つに、改行は折り返しヒント - ・
pre:空白・改行をそのまま保持 - ・
pre-wrap:保持しつつ折り返しも有効 - ・
nowrap:折り返ししない・空白は1つに
つまりブラウザは「見た目では空白文字を整理してくれる」ものの、コピー時には元のホワイトスペース文字が全てそのままコピーされます。これが「表示は綺麗なのにコピペすると変な空白が混じる」原因。
よくあるトラブル
- ・SNS引用RTで文字数オーバー:ゼロ幅スペースが含まれ、見た目以上に文字数を消費
- ・Excel CSVが読めない:先頭のBOM(U+FEFF)が「文字化け」と判定される
- ・Wordから貼り付けたら改行がおかしい:U+2028(LINE SEPARATOR)が混入
- ・HTMLで全角空白が消える:CSS white-space: normalで連続空白が1つに圧縮される
- ・パスワード入力で「合ってるのにエラー」:NO-BREAK SPACE(U+00A0)が混入
UnicodeのWhite_Spaceプロパティ
Unicode仕様には「White_Space」というプロパティが定義されており、PropList.txtで25種類のホワイトスペース文字がリストアップされています。 U+0009からU+000Dの制御文字、U+0020半角空白、U+0085 NEL、U+00A0 NBSP、U+1680 OGHAM SPACE、U+2000-U+200Aの各種「空白文字」、U+2028 LS、U+2029 PS、U+202F NARROW NBSP、U+205F MMSP、U+3000全角空白。
このプロパティに基づき、JavaScriptの/\s/正規表現やString.prototype.trim()はこれらの文字をホワイトスペースとして扱います。
ゼロ幅文字は別カテゴリ
UnicodeのWhite_Spaceプロパティには、U+200B(ZERO WIDTH SPACE)やU+200D(ZWJ)、U+FEFF(BOM)は含まれません。 これらは「ホワイトスペース」ではなく「不可視のフォーマット文字」として別カテゴリ扱いです。
したがって普通のtrim()では削除されず、専用の除去処理が必要になります。 本ツールはこれらを別カテゴリとして個別に削除対象に含めています。
本ツールでの処理対象
- ・空白統一:U+0020 / U+3000 / U+0009 / U+00A0 / U+2000-U+200A 等を統一
- ・改行統合:U+000A / U+000D / U+2028 / U+2029 を扱い、空行は段落区切りとして保持
- ・不可視文字除去:U+200B / U+200C / U+200D / U+FEFF などフォーマット文字を削除
- ・NFC正規化:String.prototype.normalize('NFC')を最後に適用