隠し文字インスペクター
テキストツール
読み込み中
ツールを読み込んでいます
ツールのコードは開いたときにのみ読み込まれます。
このツールの処理はすべてブラウザー内で行われ、入力内容はサーバーへ送信されません。
このツールについて
見た目が同じテキストでも、含まれるコードポイントは異なることがあります。貼り付けたテキストやローカルの UTF-8 ファイルから、ゼロ幅文字、改行しない空白、方向制御文字、不正な UTF-16 単位を確認できます。固定した Unicode 17.0.0 のデータを使い、診断は ASCII のみのエスケープ表示にするため、方向制御文字によって診断の並びが変わることはありません。最初は全項目が未選択です。原文を残したまま、削除する出現箇所を判断してください。検出は確認のきっかけであり、悪意の証明ではありません。
主な用途
- 識別子、検索語、コピーした値の完全一致を妨げる NBSP やゼロ幅スペースを見つけます。
- コピーしたソース内の方向制御文字や意図しない区切りを、テキストを実行せず、診断内で制御文字を直接表示せずに確認します。
- 意図した絵文字の結合子、文字の字形に必要な結合子、異体字セレクターを、貼り付け時の不要な文字と区別してから削除します。
使い方
- 1.テキストを貼り付けるか、厳密に UTF-8 として読み込むテキストファイルを 1 つ開きます。選択の前に原文を確認してください。\u200B のような表記を直接入力しても普通の ASCII 文字です。下の例だけは正確なテストデータを示すため、エスケープ済み JSON 文字列を使っています。 検査を実行し、コードポイント、Unicode 名または診断ラベル、カテゴリ、正確な位置を確認します。表は 1 ページ 50 行ですが、集計と JSON レポートは全出現箇所を含みます。原文と削除後のエスケーププレビューは、それぞれ最大 4,000 入力 UTF-16 単位です。
- 2.元の UTF-16 オフセットを確認しながら行ごとに選択します。初期選択はなく、1 箇所を選んでも同じ文字の全出現箇所は選ばれません。選択した完全な単位またはコードポイントだけを削除し、それ以外の空白、改行、原文は保ちます。
- 3.削除後のエスケーププレビューと残った検出項目を確認し、ASCII のみの完全な JSON 診断レポートをダウンロードします。削除後の生テキストを出力するには明示的な確認が必要で、対応しないサロゲートが残っている間はコピーもダウンロードもできません。入力変更で前の検査結果と選択は無効になります。
正確に再現できる文字検査
NBSP を残し、ゼロ幅スペースだけを削除
input (ASCII JSON): "A\u00A0B\u200BC" selected UTF-16 offsets: [3]
{"codePointCount":5,"occurrences":[{"codePoint":"U+00A0","utf16Offset":1,"codePointIndex":1,"line":1,"column":2},{"codePoint":"U+200B","utf16Offset":3,"codePointIndex":3,"line":1,"column":4}],"cleanedAscii":"\"A\\u00A0BC\"","rawExportable":true}オフセット 3 だけを選択します。オフセット 1 の NBSP は残るので、結果は通常の ASCII 空白を使った A BC ではありません。
同一文字の最初の出現だけを削除
input (ASCII JSON): "x\u200B\u200By" selected UTF-16 offsets: [1]
{"codePointCount":4,"occurrences":[{"codePoint":"U+200B","utf16Offset":1,"codePointIndex":1,"line":1,"column":2},{"codePoint":"U+200B","utf16Offset":2,"codePointIndex":2,"line":1,"column":3}],"cleanedAscii":"\"x\\u200By\"","rawExportable":true}連続した 2 個の U+200B は 2 行になります。オフセット 1 を選んでも、元のオフセット 2 の文字は保持されます。
方向制御文字を確認して明示的に削除
input (ASCII JSON): "a\u202Eb\u202Cc" selected UTF-16 offsets: [1,3]
{"codePointCount":5,"occurrences":[{"codePoint":"U+202E","utf16Offset":1,"codePointIndex":1,"line":1,"column":2},{"codePoint":"U+202C","utf16Offset":3,"codePointIndex":3,"line":1,"column":4}],"cleanedAscii":"\"abc\"","rawExportable":true}原文には RIGHT-TO-LEFT OVERRIDE と POP DIRECTIONAL FORMATTING があります。選択した両方の制御文字を削除し、英字は元の論理順序のまま残ります。
絵文字の接合子と異体字セレクターを保持
input (ASCII JSON): "\uD83D\uDC69\u200D\uD83D\uDCBB\u0645\u06CC\u200C\u0631\u0648\u0645\u2764\uFE0F" selected UTF-16 offsets: []
{"codePointCount":11,"occurrences":[{"codePoint":"U+200D","utf16Offset":2,"codePointIndex":1,"line":1,"column":2},{"codePoint":"U+200C","utf16Offset":7,"codePointIndex":5,"line":1,"column":6},{"codePoint":"U+FE0F","utf16Offset":12,"codePointIndex":10,"line":1,"column":11}],"cleanedAscii":"\"\\uD83D\\uDC69\\u200D\\uD83D\\uDCBB\\u0645\\u06CC\\u200C\\u0631\\u0648\\u0645\\u2764\\uFE0F\"","rawExportable":true}女性技術者の絵文字は ZWJ、ペルシア語の語は ZWNJ、ハートは VS16 を使っています。補助平面の絵文字はそれぞれ UTF-16 の 2 単位です。3 個の書式文字は検出されても未選択なので、意図した列をそのまま保持します。
空白とタブを削除し、CRLF は保持
input (ASCII JSON): "a b\tc\r\nd" selected UTF-16 offsets: [1,3]
{"codePointCount":8,"occurrences":[{"codePoint":"U+0020","utf16Offset":1,"codePointIndex":1,"line":1,"column":2},{"codePoint":"U+0009","utf16Offset":3,"codePointIndex":3,"line":1,"column":4},{"codePoint":"U+000D","utf16Offset":5,"codePointIndex":5,"line":1,"column":6},{"codePoint":"U+000A","utf16Offset":6,"codePointIndex":6,"line":1,"column":7}],"cleanedAscii":"\"abc\\r\\nd\"","rawExportable":true}SPACE と TAB を選択します。CR と LF は UTF-8 にしても元のバイトを保ちます。元の位置は両方とも 1 行目で、6 列目と 7 列目です。
CRLF、行区切り、段落区切りを区別
input (ASCII JSON): "A\r\nB\u2028C\u2029D" selected UTF-16 offsets: [4]
{"codePointCount":8,"occurrences":[{"codePoint":"U+000D","utf16Offset":1,"codePointIndex":1,"line":1,"column":2},{"codePoint":"U+000A","utf16Offset":2,"codePointIndex":2,"line":1,"column":3},{"codePoint":"U+2028","utf16Offset":4,"codePointIndex":4,"line":2,"column":2},{"codePoint":"U+2029","utf16Offset":6,"codePointIndex":6,"line":3,"column":2}],"cleanedAscii":"\"A\\r\\nBC\\u2029D\"","rawExportable":true}元の行位置では CRLF を 1 回、各 Unicode 区切りをそれぞれ 1 回と数えます。U+2028 を削除すると B と C がつながり、残った U+2029 は次の段落を区切ります。
分解形と合成形を別のまま保持
input (ASCII JSON): "e\u0301\u00E9" selected UTF-16 offsets: []
{"codePointCount":3,"occurrences":[],"cleanedAscii":"\"e\\u0301\\u00E9\"","rawExportable":true}結合アキュートアクセント U+0301 はこの検出範囲に含まれず、何も選択しません。e と結合文字の列と、合成済み U+00E9 は正規化されず別のままです。
対応しないサロゲートが 1 個残ると生出力は禁止
input (ASCII JSON): "A\uD800B\uDC00C" selected UTF-16 offsets: [1]
{"codePointCount":5,"occurrences":[{"codePoint":"U+D800","utf16Offset":1,"codePointIndex":1,"line":1,"column":2},{"codePoint":"U+DC00","utf16Offset":3,"codePointIndex":3,"line":1,"column":4}],"cleanedAscii":"\"AB\\uDC00C\"","rawExportable":false}上位サロゲートを削除しても下位サロゲートが対応せず残っています。エスケープ診断は利用できますが、生のコピーと UTF-8 ダウンロードは禁止されたままです。
不正な 2 単位をそれぞれ明示的に削除
input (ASCII JSON): "A\uD800B\uDC00C" selected UTF-16 offsets: [1,3]
{"codePointCount":5,"occurrences":[{"codePoint":"U+D800","utf16Offset":1,"codePointIndex":1,"line":1,"column":2},{"codePoint":"U+DC00","utf16Offset":3,"codePointIndex":3,"line":1,"column":4}],"cleanedAscii":"\"ABC\"","rawExportable":true}両方の対応しないサロゲートを選択します。結果は正確に ABC になり、別途確認した後で生の出力が可能になります。
BOM を削除し補助平面の異体字セレクターを保持
input (ASCII JSON): "\uFEFF\uD83D\uDE00\uDB40\uDD00X" selected UTF-16 offsets: [0]
{"codePointCount":4,"occurrences":[{"codePoint":"U+FEFF","utf16Offset":0,"codePointIndex":0,"line":1,"column":1},{"codePoint":"U+E0100","utf16Offset":3,"codePointIndex":2,"line":1,"column":3}],"cleanedAscii":"\"\\uD83D\\uDE00\\uDB40\\uDD00X\"","rawExportable":true}U+FEFF を選択し、絵文字と U+E0100 を保持します。セレクターは UTF-16 オフセット 3、コードポイント索引 2 から始まり、座標の違いが確認できます。
よくある確認ミス
- 表に載ったという理由だけで、意図した空白、改行、接合子、異体字セレクターまで全部削除すること。
- UTF-16 オフセットをバイト位置や画面上の列だと思うこと。絵文字や結合列では値が異なります。
- ASCII の 6 文字 \u200B を貼り付け、自動的に本物のゼロ幅スペースへ復号されると考えること。
- 50 行のページや 4,000 単位の短縮プレビューを見て、レポートや集計も途中で切れていると考えること。
- エスケープ済みレポートを秘密情報の削除済みデータとして共有すること。ASCII エスケープは読める可逆な形式で内容を保持します。
- 削除と同時に同等の綴りの正規化や改行変換も行われると期待すること。変わるのは明示的に選択した出現箇所だけです。
制限と注意事項
- 検出範囲は Unicode 17.0.0 の一般カテゴリ Cc、Cf、Zs、Zl、Zp、Default_Ignorable_Code_Point 属性、および対応しない UTF-16 サロゲートです。そのため通常の U+0020 SPACE、タブ、改行も表示されます。属性が重なっても 1 箇所を重複して数えません。見えない字形、紛らわしい文字、悪意あるコード、安全でない識別子を網羅する検査ではありません。同じテキストでもフォントやアプリによって表示は変わります。 ゼロ幅接合子 ZWJ、ゼロ幅非接合子 ZWNJ、異体字セレクター、双方向制御文字は、絵文字、各言語の文字、混在方向の文章に正当な用途があります。削除によって綴り、字形、絵文字の表現、読む順序が変わる場合があります。一般の結合文字すべてを検出するわけではありません。安全性の判定、書記素クラスタの分割、Unicode 双方向アルゴリズムの表示再現は行いません。
- UTF-16 オフセットとコードポイント索引は 0 始まり、行と列は 1 始まりです。列は書記素クラスタ、端末セル、画面の幅ではなくコードポイント数です。補助平面の文字は UTF-16 の 2 単位で 1 コードポイントです。対応しないサロゲートは Unicode スカラー値ではなく、診断用の擬似単位として 1 個と数えます。CRLF は 1 回の改行で、CR と LF 自体は前の行の連続する列に表示されます。 LF、単独の CR、VT、FF、NEL、LS、PS はそれぞれ直後から新しい行になります。タブはコードポイントの 1 列、空の入力は 1 行と数えます。
- 検査器は Unicode 正規化、前後の空白削除、空白の置換、暗黙の改行変換を行いません。元のオフセットで選択箇所だけを削除し、未選択の UTF-16 単位と原文を保持します。ブラウザーの貼り付けやクリップボード処理によって、このツールの外でテキストが変わることはあります。厳密な改行保持には、ファイル入力と確認済みのダウンロードを優先してください。
- 処理は同期的かつローカルで、入力は最大 100,000 UTF-16 単位、UTF-8 ファイルは最大 400,000 バイトです。アップロード、ネットワーク参照、永続保存はしません。不正な UTF-8 は U+FFFD に置換せず拒否します。BOM があれば U+FEFF として検査し、黙って除去しません。別のデコーダーですでに変わったテキストは復元できません。 ASCII JSON レポートは最大 40,000,000 文字です。上限を超えた場合は部分的なレポートを返さず、出力を停止します。
- プレビューと診断 JSON は非 ASCII 文字と制御文字をエスケープします。一方、削除後の生テキストには残った文字がそのまま含まれ、別のエディターの表示に影響する可能性があります。完全なレポートにはエスケープした原文と結果の全文が含まれる場合があります。エスケープは匿名化や暗号化ではないため、共有前に秘密情報を確認してください。対応しないサロゲートが残る場合は、符号化時の黙った置換を避けるため生の UTF-8 出力を禁止します。 Unicode のセキュリティ指針は文字属性の検出より広い範囲を扱います。UTR #36 は更新が停止した歴史的な資料で、現在の包括的なチェックリストではありません。Unicode は UTS #39 などの新しい資料も案内しています。このツールはそれらの完全なセキュリティ機構を実装せず、文字列、ファイル、リポジトリの安全性を保証しません。
よくある質問
普通の空白や改行も表示されるのはなぜですか?
対象にすべての Cc 制御文字と Zs/Zl/Zp 区切り文字が含まれ、U+0020、TAB、CR、LF も該当するためです。属性を漏れなく確認するための表示であり、自動削除の指定ではありません。意図した空白は選択しないでください。
検出結果の有無でテキストの安全性を判断できますか?
いいえ。ZWJ は絵文字の列を構成し、ZWNJ は語の字形に作用し、異体字セレクターは特定の表示を指定できます。削除を選ぶ前に前後の文脈と用途を確認してください。 できません。対象は記載した固定 Unicode 属性と不正な UTF-16 だけです。すべての紛らわしい文字、特殊な結合列、フォント依存の空白字形、有害なプログラム動作を検出するものではありません。安全性の判断には言語を理解するツールと人による確認も必要です。
同じ文字が繰り返される場合、1 個だけ削除できますか?
はい。選択は元の UTF-16 オフセットごとの出現箇所に対して行います。x\u200B\u200By のオフセット 1 を選ぶと最初だけが消え、元のオフセット 2 の文字は残ります。結果は原文から再構成するので、前方の削除で後方の選択位置がずれることはありません。
生テキストをコピーまたはダウンロードできないのはなぜですか?
対応しないサロゲートには有効な UTF-8 符号化がありません。結果に残っている間は U+FFFD に黙って置換せず、生の出力を禁止します。ASCII の診断レポートは利用できます。修正が適切と判断した場合だけ、該当する不正な単位を削除してください。
- Unicode 17.0.0 UCD:名前と一般カテゴリ
- Unicode 17.0.0 UCD:Default_Ignorable_Code_Point
- UAX #9、Unicode 17:双方向アルゴリズム
- UTR #36:更新停止済みの Unicode セキュリティ上の考慮事項
- UTS #39:Unicode セキュリティ機構