すべての記事

見えない空白文字:見た目が同じテキストの比較がなぜ失敗するのか

日本語入力には半角スペースとは別に全角スペース(U+3000、「 」)があり、IMEで日本語入力モードのまま何気なくスペースキーを押すと、見た目はほぼ同じでも実際には全角スペースが入力されていることがよくある。文章の中では気づきにくいが、JSONのキー名やコードの中に紛れ込むと構文エラーの原因になる。

なぜ奇妙なバグを引き起こすのか

最も典型的な例は、画面上のテキストが同一に見えても、文字列比較が予期せず「等しくない」を返すことです。原因は多くの場合、一方の文字列に半角スペースが、もう一方に全角スペースが含まれていることです。特に全角と半角が混在しやすい日本語のフォームや検索ボックスでは、視覚的にはほぼ違いがなくても、コンピュータにとっては別の文字として扱われます。

Trim

Trimは文字列の先頭と末尾から空白文字を削除し、中間のコンテンツはそのままにします。これはユーザー入力をクリーンアップする標準的な操作です — フォームフィールドの先頭にある意図しない余分なスペースが、値の比較や検証に影響を与えるべきではありません。

スペースの結合

もう1つの一般的な操作は、連続する複数の空白文字を1つに置き換えることです。これは、PDFや表などのフォーマットされたソースからコピーされたテキストに便利です。そこでは、1つのスペースの代わりに二重スペースや意図しないタブが現れることがあります。

この機能が必要な理由

  • 見た目が同一の2つの文字列の比較がなぜ失敗するのかを診断する。
  • 他のソースからコピーされたテキストを、紛れ込んだ全角スペースなどの見えない文字からクリーンアップする。
  • データベースに保存する前にユーザー入力を正規化する。

幅ゼロ文字

目に見える空白文字とは別に、幅ゼロ文字(zero-width space、zero-width joiner)というものがあります — これらは画面上でまったくスペースを取りませんが、テキスト内には独立した文字として存在しています。こうした文字は一部のウェブサイトやメッセンジャーからコピーする際にテキストに紛れ込むことがあり、テキストエディタで見ても完全に見えないまま、文字列比較や検索を気づかれずに壊してしまうことがあります。

ツールを試す