AIの文章に潜む「見えない文字」の正体と削除方法
AI文章の整形コラム
見た目はまったく普通の文章なのに、単語で検索してもヒットしない。文字数カウントが1文字だけ合わない。コピペしたはずのコードがエラーになる。
こうした不可解な現象の原因は、多くの場合「見えない文字」です。その正体と、混入する経路、確認と削除の方法を順に説明します。
見えない文字とは何か
文字コード(Unicode)には、画面に表示されない・幅を持たない文字がいくつも定義されています。
代表的なものを挙げると、
- ゼロ幅スペース(U+200B): 幅がゼロの区切り文字。「ここで改行してもよい」という位置のヒントとしてWebページで使われます。
- ノーブレークスペース(U+00A0): 行末で単語が泣き別れ(※)しないようにする特殊な空白。これもWeb由来のコピペに多く紛れます。
- 狭いノーブレークスペース(U+202F): 数字と単位の間などに使われる、幅の狭い空白です。
- BOM(U+FEFF): 本来はファイルの先頭で文字コードの種類を示すための印です。
※:泣き別れ=1単語が2行に分かれてしまうなど、意図しない所で分割されてしまうこと
いずれも本来は正当な役割を持つ文字で、悪者ではありません。問題はコピーと貼り付けを行う中で、意図しない場所へ紛れ込むことです。
AIの出力にも混じることがある
混入経路として昔からあるのはWebページからのコピペですが、最近はもうひとつ、AIの出力そのものという経路が加わりました。
実際に、ChatGPTの一部のモデルで、通常のスペースの代わりに狭いノーブレークスペース(U+202F)が出力される現象が報告されています。この件は「AIが文章に透かしを埋め込んでいるのではないか」という憶測を呼びましたが、OpenAIは意図的な仕組みではなく、学習の過程に由来する癖だと説明したとされています。真偽の議論はさておき、「AIの出力には特殊な空白が混じることがある」という事実だけ知っておけば十分です。
何が困るのか
見えない文字が紛れ込むと、次のような場所で実害が出ます。
- 検索・置換でヒットしない。見た目は同じ単語なのに、間に幅ゼロの文字が挟まっていると別の文字列として扱われてしまいます。
- Excelの照合関数が一致しない。VLOOKUPで「同じ値のはずなのに見つからない」ときは、これが原因の可能性があります。
- プログラムのコードに混入すると構文エラーになる。エラー位置に何も見えないので原因に気づくまで延々と悩むことになります。
- 文字数制限のある入稿やフォームで、数がどうしても合わない。
共通するのは、目視ではまず気づけないという点です。
確認する方法
エンジニアであれば、VS Codeなど特殊文字をハイライト表示できるエディタで開くのが確実です。
もっと手軽なのは、当サイトのSuppinizeに貼り付ける方法です。テキストに見えない文字が含まれていれば「見えない文字を N 個除去しました」と個数が表示されます。
何も表示されなければ、混入はありません。個数を数える機能として使えるので、削除するつもりがなくても、疑わしいときの検査に役立ちます。
削除する方法
正規表現が使えるエディタなら、対象の文字コードを指定して一括置換できます。たとえばゼロ幅スペースなら「\u200B」のように文字コードで指定して検索し、空文字に置換します。ただし、対象の文字を一つずつ指定する必要があり、どの文字が混じっているかが分からない状態では手間がかかります。
Suppinizeの場合は貼り付けるだけで、上で挙げたような不可視文字をまとめて処理します。
これらの扱い方には色々な考え方があるのですが、現在の仕様は下記の通りです。
- ノーブレークスペースは削除ではなく普通のスペースへ置換する。削除してしまうと単語同士がくっついてしまうため。
- 絵文字を構成するゼロ幅接合子(ZWJ)はあえて対象外に。この文字を消すと、家族の絵文字(👨👩👧)のような組み合わせ絵文字がバラバラに壊れてしまうため。
「見えない文字なら何でも消せばいい」わけではない、というのがこの領域の少し面白いところです。
まとめ
見えない文字は、見えないだけに、疑ってかからないと存在に気づけません。検索がヒットしない、数が合わない、コードが動かない、そうした「見た目と挙動が食い違う」現象に出会ったら、見えない文字の混入を疑ってみると解決するかもしれません。
余計な記号をワンクリックで除去
Suppinizeなら、文章をペーストするだけでマークダウンや行頭絵文字をすっきり除去できます。