ゼロ幅文字とは?種類・見分け方・削除方法を徹底解説

ゼロ幅文字とは?種類・見分け方・削除方法を徹底解説

“コピーしたはずの文字が検索に引っかからない”“見た目は同じなのにURLが壊れる”──原因の多くは、目に見えないゼロ幅文字です。本記事では代表的な種類と混入しやすい場面、そして安全に見分けて削除する手順を、実例を交えて解説します。最短で直すなら、ブラウザで完結する Invisible Cleaner も活用してください。


ゼロ幅文字(invisible characters)とは

ゼロ幅文字は、画面上では表示されない(もしくは見分けづらい)制御系の文字の総称です。改行やタブのように“目に見えないけれど意味を持つ”文字で、文書の見た目や検索、プログラムの挙動に影響します。

代表的な種類と役割

  • ZWSP(Zero Width Space, U+200B):行折返しのヒント。スペースに見えない空白。
  • ZWNJ(Zero Width Non-Joiner, U+200C):合字の連結を阻害。南アジア言語などで使用。
  • ZWJ(Zero Width Joiner, U+200D):連結を促す。絵文字のスキントーンや複合絵文字にも関与。
  • BOM(Byte Order Mark, U+FEFF):テキストのエンディアン示唆に使われることがある特殊記号。行中に混入すると不具合の原因に。
  • 双方向制御文字(Bidi, U+202A〜U+202E ほか):右→左・左→右の表示方向を制御。見た目の順序と実際の文字列順序がズレることがある。

これらは本来“必要があって存在する”文字ですが、コピー&ペーストや外部ツール経由で意図せず混入し、トラブルを引き起こします。

どこで紛れ込む?

  • WebやSNS、翻訳ツールからの コピペ
  • メール・チャットからの 引用貼り付け
  • 絵文字や多言語テキストを含む資料の編集
  • コードエディタ/ワープロ間の 相互コピー(スタイル付き→プレーン化の過程など)

よくある症状(実害)

  • 検索にヒットしない/一致しない:同じ見た目でも内部にZWSPが混ざっていると一致判定に失敗。
  • レイアウト崩れ:行の途中で予期しない折返しが発生、UIが崩れる。
  • URL・HTML・マークダウンが壊れる:タグ名や属性名に混入するとパースエラーに。
  • 差分が増える/レビューが混乱:Gitのdiffに“見えない変更”が現れ、レビュー品質低下。
  • 正規表現・バリデーションの想定外:\sにマッチしないゼロ幅空白でフィルタをすり抜ける等。

見分け方の基本

1) 文字コードを“見える化”する

  • エディタの 制御文字表示 をON(VS Codeなら Render Control Characters など)。
  • ブラウザツールやオンラインビューアで コードポイント を確認。
  • フォント差で見え方が変わるため、複数の環境で確認すると精度が上がります。

2) シンプルな正規表現で検出する

安全に始めるための最小セット例(PCRE/JS系想定):

[​‌‍]        # ZWSP/ZWNJ/ZWJ/BOM
|[‪-‮⁦-⁩]    # 代表的なBidi制御文字

注意:無差別に \p{Cf}(書式制御)を削除すると、合成文字や一部言語の表示を壊す可能性があります。まずは 範囲を限定 し、プレビューで確認してから確定しましょう。


削除・対処の実践手順

A. ブラウザで一括クリーン(最短ルート)

  1. 文字列を Invisible Cleaner に貼り付け。
  2. 「検出」→リストで 対象文字と位置 を確認。
  3. 置換モードを選択(完全削除/安全な空白変換など)。
  4. プレビューを見てから 確定。クリップボードへコピー。

ポイント

  • すべてが“削除すべき”とは限らないため、差分プレビューを確認する。
  • 破壊的変更に備えて 元文のバックアップ を取る。

B. エディタでの対処(要バックアップ)

  • VS Code:制御文字表示ON → 検索で上記パターン入力 → 該当箇所のみ確認しながら置換。保存時に自動クリーンするタスク/拡張の導入も有効。
  • Google ドキュメント:アドオンやApps Scriptで検出→ハイライト→手動修正。
  • Microsoft Word:編集記号を表示→高度な検索で目視確認→少量ずつ置換。

初回は “検出→部分置換→一括除去” の三段階に分けると安全です。


予防策(混入させない)

  • プレーンテキストで貼り付け(ショートカットや「形式を選択して貼り付け」を活用)。
  • GitやCIに リンター/プリフック を導入して不可視文字を検出。
  • チーム規約に「レビューはRaw表示も確認」を追加。
  • 翻訳・要約ツールからの流入時は、一度クリーナーに通す 運用に。

クイックチェックリスト

  • 目視では問題ないが検索が通らない文字列では?
  • コピペ元はSNS/翻訳/他アプリ?
  • 上の正規表現で 検出 したか?
  • プレビュー で意味が変わっていないか?
  • バックアップ/差分の 復元手段 を用意したか?

まとめ(最短の解決法)

不可視な制御文字は、日常的なコピペだけで簡単に混入します。原因を正しく理解し、検出→プレビュー→確定 の順で落ち着いて処理すれば怖くありません。迷ったら、まずは Invisible Cleaner に貼り付けて状態を見える化し、必要なものだけ安全に除去しましょう。


付録:対象文字の簡易リスト

  • U+200B ZWSP(ゼロ幅空白)
  • U+200C ZWNJ(ゼロ幅非連結)
  • U+200D ZWJ(ゼロ幅連結)
  • U+FEFF BOM(バイト順マーク。文中混入は要注意)
  • U+202A〜U+202E, U+2066〜U+2069 Bidi制御文字(表示方向の制御)

ここに挙げた以外にも制御文字は存在します。対象を広げる際は、必ず小さなサンプルで 影響範囲を検証 してから本番文書に適用してください。