Unicode 文字インスペクター

テキストをコードポイントに分解し、名前、カテゴリ、ブロック、符号化を表示。不可視文字、双方向制御、そっくりな文字も検出します。

入力

このツールの役割

任意のテキストを貼り付けると、それが実際に作られている個々の文字に分解されて返ってきます。それぞれが Unicode 名、U+ 番号、どんな種類の文字か、どの文字体系とブロックに属するか、UTF-8 と UTF-16 で取るバイト、そして 6 つの異なる形式で必要とするエスケープの並びを得ます。

ほとんどの人は、何かが合わないからここに来ます。文字列が見た目より長い、同じに表示される二つの値が等しく比較されない、素の文字に見えるもののせいでユーザー名が拒否された、あるいはソースコードの 1 行が振る舞いと違って読める。四つとも同じ形をしています: 画面が示さない何かをしている文字です。

文字・コードポイント・書記素

「文字」という語は少なくとも三つの異なるものを意味し、それらを取り違えるところでほとんどの Unicode の混乱が始まります。コードポイントは Unicode 標準の一つの値で、U+0041 や U+1F600 と書かれます。書記素は読み手が一文字と数えるものです。両者はしばしば同じ数ではありません。

  • 素の「a」は 1 書記素、1 コードポイント、1 UTF-16 単位 — すべてが一致します。
  • U+00E9、合成済みの e アキュートは、1 書記素、1 コードポイント、1 UTF-16 単位です。
  • U+0065 U+0301、e に結合アクセントを続けた同じ文字は、1 書記素ですが 2 コードポイント、2 UTF-16 単位です。
  • U+1F600、にっこり顔は、1 書記素、1 コードポイントですが 2 UTF-16 単位です — BMP の上に住むので、JavaScript はそれをサロゲートペアとして保存します。
  • 家族の絵文字は、1 書記素、5 コードポイント、8 UTF-16 単位です: 二つの目に見えない接合子で結ばれた三人。

家族の絵文字が人を捕らえる場合です。一つのものに見えて、JavaScript はその長さを 8 と報告し、5 文字のデータベース列はそれを保持できません。このツールはコードポイントを、それらが作る書記素の下にまとめるので、頭の中で調整するのではなく両方の読みが一度に見えます。

見えない文字

驚くほど多くの Unicode 文字が何も描きません。周りのテキストがどう振る舞うかを制御するために存在し、印を残さないので、誰にも気づかれずコピー・ペースト・レビューを生き延びます。これらは、単に一覧するのではなくツールが指すものです:

  • ゼロ幅スペース・接合子・非接合子 (U+200B、U+200D、U+200C) — 幅も印もなく、触れるすべての文字列比較を壊します。
  • ソフトハイフン (U+00AD) — 単語がどこで折れうるかの示唆で、折れるまで見えません。
  • ノーブレークスペース (U+00A0) — スペースとまったく同じに見えて別の文字で、だから設定ファイルの中でこれほど長く生き延びます。
  • バイトオーダーマーク (U+FEFF) — しばしばファイルの先頭に残され、そこで最初の値の見えない最初の文字になります。
  • 双方向制御と上書き (U+202A〜U+202E、U+2066〜U+2069) — 周りのテキストを並べ替えます。

双方向制御は独自の言及に値します。ヘブライ語とアラビア語がラテン文字と正しく混ざれるよう加えられ、その仕事をよくこなします。しかしコメントや文字列リテラルの中に置かれた上書きは、ソースコードの 1 行を、コンパイラが読む順序とまったく異なる順序で表示させえます — つまりレビュアーが、まったく別のことをするコードを承認しうるのです。その種の手口は Trojan Source として知られ、だからこのツールはすべての双方向制御を、ほかの見えない文字と分けて指摘します。

そっくりな文字と混在文字

Unicode には ASCII 文字と視覚的に同一でそれではない文字が多くあります。キリル文字の а、ギリシャ文字の ο、ラテン文字の a は異なるコードポイントを占め、ほとんどのフォントで同じに描かれます。それらで作られたドメインやユーザー名は、正しく見えて別のところを指します。

すべての非 ASCII のそっくり文字を指摘するのは無益でしょう: すべてのロシア語・ギリシャ語・ヘブライ語の単語を赤く塗り、ふつうのテキストに反応する警告は、人が飛ばすことを覚える警告です。だからここでの規則は Unicode セキュリティ標準が使うものです — 単語は、その中の文字が二つ以上の文字体系から来るとき疑わしい、です:

  • すべてラテン文字で書かれた「paypal.com」: 言うことは何もありません。
  • ラテン文字の「ypal」の前にキリル文字の er と a を付けた同じ単語: 一つの単語、二つの文字体系、指摘されます。
  • キリル文字のロシア語の単語全体: 一つの文字体系、ふつうのテキスト、指摘されません。
  • Han・ひらがな・カタカナを一緒に使う日本語の文: 三つの用字、一つの文字体系、指摘されません。

その最後の場合が、規則に注意が要る理由です。日本語は三つの用字を一度に使って書かれ、韓国語は二つを混ぜるので、素朴な「二つ以上の用字は疑わしい」テストはすべての日本語の文を攻撃と呼ぶでしょう。本当に一つの文字体系である組み合わせは一つとして扱われ、それが警告を意味あるものに保ちます。

正規化、あるいはなぜ二つの同一の文字列が異なるのか

いくつかの文字は複数の書き方ができます。文字 é は、単一のコードポイント U+00E9 か、対の U+0065 U+0301 — 素の e に結合アキュートアクセントを続けたもの — のどちらかです。どちらも同じに表示されます。どちらも誤りではありません。それらは等しくありません。

正規化は一つの綴りを選ぶ過程で、四つの形式があります。NFC は可能なところで合成し、Web が既定で仮定するものです。NFD は代わりに分解します。二つの K 形式はさらに進んで互換文字も畳みます — 全角の A が素の A に、合字 fi が fi になります — これは検索と照合に有用で、保存には損失があります。

ここのパネルは、貼り付けたものの四つの形式すべてを示し、そのうちどれが入力と異なるかを印します。どれも異ならなければ、テキストは既に正規化されていて、追っている食い違いはほかにあります。いくつか異なれば、それを見つけたのです。

名前・カテゴリ・用字・ブロック

割り当てられたすべての文字は四つの素性を持ち、それらは異なる問いに答えます。名前は文字そのものです。一般カテゴリはそれがどんな種類のものか — 小文字、結合文字、通貨記号、書式制御 — を言います。用字はそれが属する文字体系です。ブロックはそれが割り当てられたコードポイントの範囲で、言語的ではなく整理上の事実です。

ブロックと用字は混同しやすく、しばしば食い違います。ラテン文字は少なくとも半ダースのブロックに住み、一つのブロックがいくつかの用字の文字を持ちえます。「これは何のアルファベットか」を知りたいときは用字が答えで、「これは標準のどこに住むか」を知りたいときはブロックです。

名前・用字・ブロックは、どの言語でもここでは意図的に英語で示されます。それらは標準が定める識別子であって散文ではなく — U+200D は世界中どこでも ZERO WIDTH JOINER と名付けられ、それを翻訳すると検索できなくなるからです。

エンコードとエスケープ

コードポイントは数で、エンコードが選ばれて初めてバイトになります。UTF-8 は 1 から 4 バイトを使い ASCII をそのまま保ち、だから勝ちました。UTF-16 は 1 つか 2 つの 16 ビット単位を使い、JavaScript の文字列が作られているものです — だから .length が単一の絵文字に 2 を報告するのです。

U+0041   41              # UTF-8: 1 バイト、ASCII と同じ
U+00E9   C3 A9           # UTF-8: 2 バイト
U+20AC   E2 82 AC        # UTF-8: 3 バイト
U+1F600  F0 9F 98 80     # UTF-8: 4 バイト

ここの各行は、文字を JavaScript・JSON・HTML・CSS・URL・Python でのエスケープとしても与え、コピーできます。それらはすべて同じではなく、その違いは BMP の上で重要です: JavaScript と Python はコードポイントのエスケープを持って使い、JSON はそれを持たず、絵文字を二つのサロゲートの半分として綴らねばなりません。

よくある質問

私の文字列が、見える文字の数より長いのはなぜですか?
見えない文字を含むか、いくつかのコードポイントから作られた書記素を含むかのどちらかです。両方がここに示されます: 見えない文字は指摘され、複数コードポイントの書記素はまとめられるので、一つの文字とそれが作られている複数の値が見えます。
二つの文字列が同一に見えて等しくありません。なぜですか?
たいてい正規化です。アクセント付きの文字は一つのコードポイントか、文字に結合文字を足したものでありえて、どちらも同じに表示されます。各文字列をここに貼り付けてコードポイントの一覧を比べるか、どの正規化形式が入力と異なるかを見てください。
ゼロ幅スペースとは何で、どうやって私のテキストに入ったのですか?
幅も印もない文字で、改行の機会を示唆するのに使われます。たいてい Web ページ・文書エディター・チャットクライアントからテキストをコピーして届き、何も表示されないので、何かが文字列を比較して失敗するまで、すべてのレビューを生き延びます。
コードポイントと文字の違いは何ですか?
コードポイントは一つの Unicode 値です。日常の意味での文字は書記素 — 読み手が一つと数えるもの — で、書記素はいくつかのコードポイントでありえます。家族の絵文字は五つのコードポイントと一つの書記素です。
ツールがいくつかの文字に名前がないと言うのはなぜですか?
四つの異なる理由があり、どれかを言います。サロゲートと私用のコードポイントは標準に名前がなく、未割り当てのものは名付けるものがなく、めったに調べられない歴史的なブロックの文字はこのビルドが持たない名前を持ちます — 名前の表は、すべてを収めるのではなく、人が実際に貼り付けるブロックを保ちます。
混在文字の警告は攻撃の証明ですか?
いいえ。一つの単語が二つ以上の文字体系から文字を引くことを意味し、それはなりすまし名が持つ形であり、ふつうのテキストが時々することでもあります。見る理由であって、判定ではありません。
私が貼り付けたものはサーバーに送られますか?
いいえ。文字データベースはページとともにダウンロードされ、すべてがブラウザ内で動きます。入力した内容はアップロードも記録もされず、ネットワーク接続なしで動きます。