
世界初のフォントごとのconfusablesデータセット:どのUnicode文字が似て見えるかを、人々が読むサイズで322フォントのアウトラインから測定。CC BY、Mozillaのアドオン名チェックで使用。
世界初のフォント別confusablesデータセット。 どのUnicode文字がどれと似て見えるかを、ピクセルではなくフォントのアウトラインから測定したもの。現在のリリース2026.09.26では、322フォントが描くすべての文字と数字を、実行テキスト中での各グリフのサイズとベースライン位置で比較している。ASCIIの文字と数字の類似文字は、その後、実際の配置で検証される。一般的なフォントで他の文字の間に、人が読むサイズで設定し、誰もが似ていると認めるペア(例えば0とOなど)と比較する。
addons.mozilla.orgはconfusable-visionの文字を使用してアドオン名の類似文字をチェックしており、Mozillaのソースでクレジットされている。使用実績を参照。

src/olympia/amo/confusables.py、プルリクエスト#24468、#24541、#24612、#24665(2026年2月から3月)。data/confusables_supplement.tsv、data/confusables_vision.tsv。docs/hkb.md)。これらのプロジェクトは、2026年2月と3月のconfusable-visionの出力からデータを取得した。
Hacker Newsでの議論:I rendered 1,418 confusables over 230 fontsおよびConfusables.txt and NFKC disagree on 31 characters。
リリース2026.09.26の数値:
データはdata/release/2026.09.26/にバージョン付きリリースとして公開されている(CC-BY-4.0)。namespace-guardとd0ma1nはこれに基づいて構築されている。
リリース2(2026.09.24、TLDデータは2026.09.25)は、以前の実行が比較したペアとフォントのみを比較していた。同一グリフの監査により、フォントが2つの文字を同じグリフで描く2,654ケースのうち637しか捕捉できていないことが判明した。リリース3はこれを修正し、3つのことを追加している:
2026年3月の数値(249,976の単一文字ペアと2,524,275のバイグラムペア、245フォント)は、サイズとベースラインを無視した測定から得られたものである。これらは置き換えられ、それらの実行からのファイルは参照用にdata/output/に残っている。
RaySpaceは各グリフのアウトラインを通して36角度で平行光線を投射し、各50本、光線ごとに5つのことを記録する:アウトラインを何回横切るか、どこで、どの角度で、インクを通るたびにどれだけ進むか(そのping、光線に沿ったストロークの幅)、ストローク間の最大ギャップ。各グリフは2回測定される:形状のために自身のボックス内で、サイズと位置を考慮するためにベースライン上の固定フレーム内で。2つの文字は、形状距離が0.5未満でベースライン固定距離が0.2未満のとき、あるフォントで類似している。比較はRust(native/cv-pairs)で全コアを使って実行される。
単独で測定された類似文字は、テキストの行の中で依然として目立つ可能性がある。そのため、ASCIIの文字、数字、シーケンスのすべての候補類似文字は、隣接文字の間に設定され(pa_nel、20_5)、5つのコンテキストで検証される:システムフォント13 px、およびHelvetica、Arial、Times New Roman、Georgiaの16 px、それぞれデバイスピクセル比1と2で、プラットフォームのフォントフォールバックを使用する。何も再スケーリングされない:類似文字は行内で着地する位置で比較される。
各コンテキストの基準は、誰もが似ていると認めるペア、0とO、1とl、Iとlから得られ、そのコンテキストがそれらを同じサイズと位置で描く場合のみカウントされる。類似文字は:
チェックは、両方のグリフをデバイス解像度の4倍でラスタライズして行う:デバイスピクセルより狭いギャップが閉じた後の同じ数のピースとホール;カウンターが同じ場所でほぼ同じサイズで四角または丸が類似;隣接文字との間隔;インクの上部、下部、幅;右から左への文字が周囲の数字を並べ替える;ストロークの太さ;各辺の形状(ミラーリング);インクが各コーナーにどれだけ達するか;スラント;中央のステム(YとV);ステムを横切るバー(ŦとT)。2文字シーケンスは文字ごとにチェックされる。
ティアはレンダリングされたサンプルの視覚的判断に対して調整され、受け入れられたペアに固定された。読者を対象とした研究はまだ行われていない。
Unicodeのconfusables.txtにないstrict類似文字のうち6つ、それぞれが5つのコンテキストすべてで類似している。macOSはそれぞれをNotoフォールバックフォントで描画する:

| 文字 | 名前 | 代用される文字 |
|---|---|---|
| ᱛ U+1C5B | OL CHIKI LETTER AT | O |
| ꢝ U+A89D | SAURASHTRA LETTER TTHA | O |
| 𖩠 U+16A60 | MRO DIGIT ZERO | O |
| 𑫤 U+11AE4 | PAU CIN HAU LETTER FINAL Y | O |
| ᦞ U+199E | NEW TAI LUE LETTER LOW VA | o |
| ᧐ U+19D0 | NEW TAI LUE DIGIT ZERO | o |
ほとんどの類似ドメインの背後にあるASCIIの置き換えは、一部のフォントでのみ成立する。Iのlへの置き換えはシステムフォント、Helvetica、Arialでほぼ同一。1のlへの置き換えはTimes New Romanでのみ、0のoへの置き換えはGeorgiaでのみ成立し、その数字は小文字の高さである。rnのmへの置き換えは標準密度画面のArial 16 pxでのみ成立する。dのclへの置き換えとwのvvへの置き換えは16 pxでは成立しない。
途中で:macOSとiOSに同梱されているGeorgiaは、ⅳ(U+2173、SMALL ROMAN NUMERAL FOUR)をⅸ(9)とまったく同じに描画する。Windows 11のGeorgiaは正しい。これは2026年3月にMicrosoft Q&Aで最初に報告され、Appleにも報告されている。
| ファイル | 1行あたり |
|---|---|
characters.jsonl.gz | 測定されたコードポイント。スクリプト、カテゴリ、TR39識別子タイプ、IDNA2008ステータス、およびそれをレジストリが受け入れるTLD付き |
lookalikes.jsonl.gz | 少なくとも1つのフォントまたは組み合わせで類似するペア。背後のカウントと各フォントでの距離付き |
sequences.jsonl.gz | 2文字ASCIIシーケンスに類似する文字 |
in-place.jsonl.gz | 実際の配置で検証された候補類似文字。各コンテキストでの判定と失敗したチェック付き |
DATASET.mdには、すべてのフィールド、何が比較されたか、ペアが存在しないことの意味、推奨しきい値が記載されている。リリースはバージョンで固定する。その他のコミット済み出力:
| ファイル | 説明 |
|---|---|
data/output/idn-relevant-pairs.json | リリースのIDNビュー:しきい値を通過し、その文字が両方とも共通のTLDで登録可能な2,923ペア。npx tsx scripts/export-idn-pairs.ts |
data/output/confusable-weights-v4.json、font-specific-weights-v4.json | namespace-guard用の重み:ASCII文字または2つのスクリプトを含むペアを、それらが類似するフォントの割合でスコアリング(全体およびフォント別)。scripts/generate-weights-release.ts、scripts/generate-font-weights-release.ts |
data/output/unicode-submission/ | Unicodeのconfusablesデータへの追加提案。各行の背後の測定付き。scripts/build-unicode-submission.ts |
data/input/tld-rules.json | 各委任TLDのレジストリが第2レベルで受け入れる文字。IANAのIDNテーブル、ICANNレジストリ契約、調査された国コードポリシーから。scripts/build-tld-rules.py;d0ma1nがこれをインポートする |
macOS(Core Textがテキストを設定する)、Node 22以降、Rust、およびSwiftヘルパー用のXcodeコマンドラインツールが必要。
npm install
(cd native/cv-pairs && cargo build --release)