日本語入力には半角スペースとは別に全角スペース(U+3000、「 」)があり、IMEで日本語入力モードのまま何気なくスペースキーを押すと、見た目はほぼ同じでも実際には全角スペースが入力されていることがよくある。文章の中では気づきにくいが、JSONのキー名やコードの中に紛れ込むと構文エラーの原因になる。
なぜ奇妙なバグを引き起こすのか
最も典型的な例は、画面上のテキストが同一に見えても、文字列比較が予期せず「等しくない」を返すことです。原因は多くの場合、一方の文字列に半角スペースが、もう一方に全角スペースが含まれていることです。特に全角と半角が混在しやすい日本語のフォームや検索ボックスでは、視覚的にはほぼ違いがなくても、コンピュータにとっては別の文字として扱われます。
Trim
Trimは文字列の先頭と末尾から空白文字を削除し、中間のコンテンツはそのままにします。これはユーザー入力をクリーンアップする標準的な操作です — フォームフィールドの先頭にある意図しない余分なスペースが、値の比較や検証に影響を与えるべきではありません。
スペースの結合
もう1つの一般的な操作は、連続する複数の空白文字を1つに置き換えることです。これは、PDFや表などのフォーマットされたソースからコピーされたテキストに便利です。そこでは、1つのスペースの代わりに二重スペースや意図しないタブが現れることがあります。
この機能が必要な理由
- 見た目が同一の2つの文字列の比較がなぜ失敗するのかを診断する。
- 他のソースからコピーされたテキストを、紛れ込んだ全角スペースなどの見えない文字からクリーンアップする。
- データベースに保存する前にユーザー入力を正規化する。
幅ゼロ文字
目に見える空白文字とは別に、幅ゼロ文字(zero-width space、zero-width joiner)というものがあります — これらは画面上でまったくスペースを取りませんが、テキスト内には独立した文字として存在しています。こうした文字は一部のウェブサイトやメッセンジャーからコピーする際にテキストに紛れ込むことがあり、テキストエディタで見ても完全に見えないまま、文字列比較や検索を気づかれずに壊してしまうことがあります。