ByteScope

Invisible Character Checker

テキストを貼るかファイルを置いて、画面に出ない文字を一つ残らず確認する。ゼロ幅スペース、Bidi の上書き、Unicode タグ、変わった空白、ラテン文字の単語に紛れたキリル文字。コードポイント付きのバッジで表示し、選んだものを削除します。

ファイルはブラウザから送信されません — 処理はすべてローカルで行われます。

テキストファイルをここにドロップ

UTF-8・UTF-16・従来の文字コードに対応、20 MiB まで。クリックして選ぶこともできます。読み込みはこのタブの中だけで、アップロードはしません。

テキストの種類

種類を切り替えても変わるのは深刻度の判定だけで、見つかる文字は同じです。

このチェックでわからないこと

  • これは AI 判定ツールではありません。これらの文字が見つかっても AI が書いた証拠にはならず、見つからなくても AI が書いていない証拠にはなりません。
  • 見た目が同じ別の文字は、ラテン文字とほかの文字体系が混ざった単語の中だけを調べます。全部キリル文字で綴ってラテン文字に見せかけた単語(whole-script の偽装)は検出しません。
  • ゼロ幅文字や異体字セレクタには、絵文字・ペルシャ語・インド系文字での正当な使い道があります。「正当な用途らしい」という表示は推測で、どちらの方向にも間違うことがあります。
  • フォントによる見間違いは検出しません。l と I、0 と O は別の ASCII 文字で、フォントによって似て見えるだけです。
  • ラテン文字への置き換えは UTS #39 の skeleton の一部だけです。A–Z・0–9 に対応づけられるキリル文字・ギリシャ文字・アルメニア文字・チェロキー文字だけを置き換え、NFD 分解はしません。confusables データ:Unicode 17.0.0。

このツールについて

テキストには、画面上で幅を取らないのに意味を変えてしまう文字が潜んでいることがあります。検索を外すゼロ幅スペース、コードの見た目とコンパイル結果を食い違わせる右から左への上書き、言語モデルにしか読めない命令を綴った Unicode タグ文字の列、ラテン文字の単語に紛れ込んだキリル文字の а でリンク先が別の場所になる、といったものです。テキストを貼るか、最大 20 MiB のテキストファイルを置いてください。文字コードは自動判定します。疑わしい文字はその場所に ZWSP、RLO、TAG a のようなバッジで表示され、コードポイント、Unicode の名前、分類が付きます。送信はせず、解析はこのタブの中で行います。

印を付けるもの

双方向制御文字。U+202A から U+202E、U+2066 から U+2069、それに LRM、RLM、ALM。Trojan Source 攻撃の仕組みで、画面でレビューしたコードとコンパイラが読むコードが別物になります。ゼロ幅文字:U+200B ZWSP、U+200C ZWNJ、U+200D ZWJ、U+2060 WJ、U+FEFF。Unicode タグ文字 U+E0000 から U+E007F は、隠している ASCII に戻して表示します。プロンプトインジェクションで LLM への命令を忍ばせる既知の手口です。変わった空白:NBSP、thin/narrow スペース、全角スペース U+3000。異体字セレクタは、連続して並ぶと隠しデータの可能性があります。ソフトハイフンなどの書式文字、制御文字、私用領域のコードポイント。そして同形字(ホモグリフ):ラテン文字の単語にキリル文字やギリシャ文字が混ざったもの、たとえばキリル文字の р と а で綴った paypal。Unicode UTS #39 の confusables データを使い、複数の文字体系が混ざった単語として見つけます。三つのモード(文章、コード、URL またはユーザー名)が変えるのは表示する深刻度だけで、検出内容は変わりません。

正当な使い方として扱うもの

ゼロ幅文字がすべて攻撃というわけではありません。絵文字の ZWJ シーケンス(家族や職業の絵文字)、国旗のタグシーケンス、絵文字表示セレクタ、ペルシア語やインド系文字の中の ZWNJ と ZWJ、日本語や中国語の全角スペース、先頭の BOM は、警告ではなく情報として表示します。「削除」は既定で Bidi、タグ、ゼロ幅の文字を取り除きますが、こうした正当な使い方はそのまま残します。同形字は、一語ずつあなたが確認した単語だけ置き換えます。ギリシャ語の文の中のギリシャ語の単語は偽物ではないからです。結果はコピーするか、ファイルとして保存できます。

限界

これらの文字が見つかっても AI が書いた文章だとは言えませんし、見つからなくても AI が書いていないとは言えません。「ChatGPT の透かし文字」と言われるものの多くは、ノーブレークスペース、狭いスペース、ダッシュといったごく普通の組版で、ワープロやウェブページが何十年も前から入れてきたものです。同形字の検査は文字体系の混在しか見ません。単語全体をキリル文字で綴ったものは、検査にとっては正しいキリル文字の単語です。正当な使い方かどうかの判定は、どちらの方向にも間違えることがあります。フォントの段階で起きる混同、たとえば小文字の l と大文字の I が同じに見えるフォントの問題は Unicode の話ではなく、ここでは検出しません。

よくある質問

文章が ChatGPT や AI で書かれたかどうか分かりますか?

分かりません。これらの文字が見つかっても AI が書いた文章だとは言えませんし、見つからなくても AI が書いていないとは言えません。「ChatGPT の透かし文字」として出回っているものの大半、ノーブレークスペース、狭いスペース、ダッシュは、ワープロやウェブのエディタ、ブラウザからのコピー&ペーストが勝手に生み出す普通の組版です。このページが言えるのは、どの文字がどこにあるか、それだけです。どう解釈するかはあなたが決めてください。

ゼロ幅スペースとは何で、どうやって文章に入り込んだのですか?

U+200B ZWSP は幅のない文字で、ここで改行してよいという印です。ウェブページ、チャットアプリ、一部のエディタからのコピー&ペーストで入ってきて、検索が当たらない、同じに見える名前にユーザー名を「取られている」、ファイル名が開けない、といったことが起きるまで見えません。ここに貼れば一つずつ ZWSP バッジで見え、「削除」で取り除けます。U+200C ZWNJ、U+200D ZWJ、U+2060 WJ、U+FEFF などの仲間も同じように扱います。

Trojan Source とは何ですか? コードをどう確認すればいいですか?

Trojan Source は、ソースコードの中に双方向制御文字(U+202A から U+202E、U+2066 から U+2069)を入れて、レビューする人が画面で見る順番とコンパイラが読む順番を食い違わせる手口です。コメントが見た目の上で一文を飲み込んだり、文字列が見えている場所とは別のところで終わったりします。コードをコードモードで貼ってください。Bidi 制御文字はすべてその位置にバッジで出て、「削除」で取り除けます。

Unicode タグ文字とは何で、なぜプロンプトインジェクションに使われるのですか?

U+E0000 から U+E007F は ASCII と一対一で対応する文字のブロックですが、ほぼすべてのフォントで何も表示されません。これで書いた文は、ページを読む人には見えず、生のテキストをトークン化する言語モデルにはそのまま読めます。だからウェブページ、文書、チャットメッセージに隠し命令を仕込む手段として知られています。このページはタグ文字の列を、それが綴る ASCII に戻して表示します。「何かある」ではなく、隠された文が何と言っているかが分かります。一部の絵文字の国旗が使うタグシーケンスだけが正当な用途で、情報として表示します。

同形字の検査はどう動いていますか?

複数の文字体系が混ざった単語、つまりラテン文字の単語の中にキリル文字やギリシャ文字が入ったものを探します。どの文字が見た目で入れ替え可能かは Unicode UTS #39 の confusables データで判断します。キリル文字の р と а を使った paypal には印が付きます。ロシア語の文には付きません。各単語の文字がすべてキリル文字だからです。つまり、単語全体をキリル文字で綴ってラテン文字の単語に似せたものは捕まえられませんし、l と I が同じに見えるフォントの問題は Unicode には分かりません。置き換えはあなたが確認した単語だけで、自動では行いません。

削除すると絵文字やペルシア語、ヒンディー語が壊れませんか?

既定の削除は Bidi 制御文字、タグ文字、ゼロ幅文字を取り除きますが、役割がはっきりしているものは残します。家族や職業の絵文字をつなぐ ZWJ、国旗のタグシーケンス、記号を絵文字として表示させる表示セレクタ、ペルシア語、アラビア語、インド系文字で字形をつなぐ ZWNJ と ZWJ です。これらは削除対象ではなく、見えるように情報として表示します。判定は経験則なので、どちらの方向にも間違えることがあります。大事な場所に貼る前に結果を見てください。

テキストは送信されますか?

されません。テキストもファイルもこのタブの中で解析し、どのサーバーにもリクエストを送りません。20 MiB のファイルは File API で読み、文字コードもローカルで判定します。削除後の結果はメモリからコピーまたはダウンロードします。だから、どこにも送りたくないテキスト、契約書、誰かがメールしてきたパスワードの一覧、怪しいと思うコードの断片でも、ここに貼って構いません。