
793 verwechselbare Paare, die in Unicode TR39 fehlen, weltweit erster skriptübergreifender Datensatz, schriftartenbewusste SSIM-Bewertung über 230 Schriftarten und 22.000+ Zeichen
Empirische Glyphen-Ähnlichkeitsbewertung mittels Vektorkontur-Strahlenabtastung. Rendert Unicode-verwechselbare Zeichenpaare über 245 Systemschriftarten hinweg, misst strukturelle Ähnlichkeit direkt aus den Schriftkonturen (keine Rasterung) und erzeugt bewertete JSON-Artefakte mit schriftartspezifischen kontinuierlichen Distanzwerten.
Wichtige Ergebnisse aus 52,6 Millionen Einzelzeichen- und 190 Millionen Multizeichen-Vergleichen über 22.581 Zeichen und 12 Schriftsysteme:
Die Ausgabe speist direkt in namespace-guard für die Laufzeiterkennung von Verwechselbarkeiten in Paketnamen, Domainnamen und Identifikatoren.
RaySpace wirft parallele Strahlen durch Schriftkonturen in 36 Winkeln und erfasst fünf Informationsebenen pro Glyphe: Kreuzungsanzahlen, Kreuzungspositionen, Kreuzungswinkel, Ping-Distanzen (Strichbreite an jeder Kreuzung) und Ping-Max (Gegenbreite zwischen Kreuzungen). Dies erzeugt eine kompakte Signatur pro Zeichen pro Schriftart. Zwei Signaturen werden mit einer gewichteten L1-Distanz über alle fünf Ebenen verglichen.
Eine dreistufige Filterkaskade macht den erschöpfenden Vergleich handhabbar:
Die Signaturdatenbank (294.646+ Einträge über 245 Schriftarten; mehr mit --include-uppercase) wird einmal vorberechnet. Die Entdeckung läuft dann als single-threaded Arithmetik auf der Datenbank und führt 52,6 Millionen Paarvergleiche in 31 Minuten ohne Worker-Threads oder GPU durch.
npm install
# 1. Erstelle die Strahlsignaturdatenbank (Voraussetzung, ~24 Min.)
npx tsx scripts/build-signature-bank.ts
# 1b. Großbuchstaben Latein A-Z einbeziehen (optional)
# Standardmäßig enthält die Datenbank nur IDNA-PVALID-Codepunkte (Kleinbuchstaben,
# Ziffern, Symbole). Verwende --include-uppercase, um Großbuchstaben A-Z hinzuzufügen, nützlich
# für Schriftidentifikation und visuellen Markenvergleich, wo Großbuchstaben
# Glyphenformen eine Rolle spielen. Der Builder ist fortsetzbar, daher berechnet dies nur
# die zusätzlichen Codepunkte.
npx tsx scripts/build-signature-bank.ts --include-uppercase
# 1c. Beliebige Codepunktbereiche einbeziehen (optional)
npx tsx scripts/build-signature-bank.ts --extra-range=0041-005A
# 2. Einzelzeichen-Entdeckung (22.581 Zeichen, 12 Schriften, ~36 Min.)
npx tsx scripts/discover-singlechar-sdf.ts --scorer=ray
# 3. Multizeichen- (Bigramm-) Entdeckung (676 Bigramme, ~63 Min.)
npx tsx scripts/discover-multichar-sdf.ts --scorer=ray
# 4. Bewerte bekannte TR39-Multizeichen-Verwechslungen (~5 Min.)
npx tsx scripts/score-multichar-sdf.ts --scorer=ray
Die ursprüngliche SSIM-basierte Pipeline bewertete 26,5 Millionen Vergleiche über 230 Schriftarten. Sie bleibt funktionsfähig, wird aber für alle Entdeckungs- und Bewertungsaufgaben durch RaySpace ersetzt.
# TR39-Bewertung verwechselbarer Paare
npx tsx scripts/build-index.ts # Render-Index (~160s, 11.370 PNGs)
npx tsx scripts/score-all-pairs.ts # Bewerte alle Paare (~65s, 235K Vergleiche)
# Entdeckung neuartiger Verwechslungen
npx tsx scripts/build-candidates.ts # Kandidatensatz (~23K Zeichen)
npx tsx scripts/build-index.ts --candidates # Kandidaten rendern (~40min, 89K PNGs)
npx tsx scripts/score-candidates.ts # Bewertung gegen lateinische Ziele (~15min, 2,9M Vergleiche)
# Extrahiere hochbewertete Funde aus beiden Pipelines
npx tsx scripts/extract-discoveries.ts
"Nullen" = Schriftarten, bei denen die Konturen bitidentische Strahlsignaturen erzeugen (Distanz 0,000). Latein w/Kyrillisch ԝ ist in allen 19 Schriftarten, die beide Glyphen enthalten, identisch.
Georgische Coda (U+10FF) bildet einen vierfach verwechselbaren Ring mit lateinischem o, kyrillischem o und griechischem Omikron, alle unter Distanz 0,08.
Die Entdeckung von oy/kyrillisch uk ist der herausragende neue Fund: Das lateinische Bigramm "oy" ist visuell identisch mit dem kyrillischen Digraphenbuchstaben uk (ѹ) bei Distanz 0,000 in Helvetica und 0,0005 in Arial Unicode MS.
Drei empfohlene Betriebsstufen:
Abfragen, welche verwechselbaren Paare für eine bestimmte Schriftart existieren. Nützlich für Schriftdesigner, die einen neuen Schriftschnitt ausliefern, Browser-Anbieter, die eine Systemschriftänderung evaluieren, oder jeden, der eine Anzeigeschriftart für sicherheitskritische Kontexte wie IDN-Domains wählt.
npx tsx scripts/query-font.ts --list-fonts # 218 Schriftarten in den Funddaten
npx tsx scripts/query-font.ts "Arial" # Alle Paare für Arial (SSIM >= 0.7)
npx tsx scripts/query-font.ts "Arial" --threshold 0.8 # Nur hohe Zuversicht
npx tsx scripts/query-font.ts "Arial" --compare "Georgia" # Diff zweier Schriftarten nach SSIM-Delta
npx tsx scripts/query-font.ts "Arial" --json # JSON für nachgelagerte Verarbeitung
Die Schriftnamenübereinstimmung erfolgt case-insensitiv als Teilzeichenfolge, daher trifft "arial" auf Arial, Arial Black und Arial Unicode MS zu. Der Vergleichsmodus sortiert nach den größten SSIM-Unterschieden zuerst und zeigt genau an, welche Paare beim Wechsel der Schriftart besser oder schlechter werden.
Erfordert die Funddateien aus der Bewertungspipeline (gitignoriert, lokal neu generieren).
| Datei | Beschreibung |
|---|---|
data/output/render-index/ | Render-PNGs + Index (SSIM-Pipeline) |
confusable-weights-v2.json mit verteilungsbezogenen Datensätzen pro Paar: Mittelwert, p50, p90, Schriftartenanzahl, Null-Distanz-Anzahl, Null-Anteil und empfohlene Stufe (streng/standard/explorativ). RaySpace-Distanzen ersetzen SSIM. 4.174 Paare bei Standardschwellwert.confusable-weights.json zur gemessenen visuellen Risikobewertung über confusableDistance({ weights })Ausführliche Artikel auf paultendo.github.io, die die Ergebnisse und Methodik hinter diesem Projekt beschreiben:
RaySpace-Methodik und Ergebnisse:
SSIM-Pipeline-Ergebnisse:
Beiträge, die das breitere Problemfeld abdecken, das dieses Projekt motiviert hat:
| Quelle | Ziel | Schriften | Mittel | Fonts | Nullen |
|---|
| w U+0077 | ԝ U+051D | Latein-Kyrillisch | 0.000 | 19 | 19 |
| j U+006A | ϳ U+03F3 | Latein-Griechisch | 0.013 | 21 | 18 |
| i U+0069 | і U+0456 | Latein-Kyrillisch | 0.018 | 62 | 50 |
| s U+0073 | ѕ U+0455 | Latein-Kyrillisch | 0.018 | 62 | 46 |
| c U+0063 | с U+0441 | Latein-Kyrillisch | 0.019 | 61 | 45 |
| o U+006F | о U+043E | Latein-Kyrillisch | 0.020 | 61 | 44 |
| j U+006A | ј U+0458 | Latein-Kyrillisch | 0.021 | 60 | 48 |
| x U+0078 | х U+0445 | Latein-Kyrillisch | 0.023 | 59 | 50 |
| p U+0070 | р U+0440 | Latein-Kyrillisch | 0.024 | 61 | 46 |
| e U+0065 | е U+0435 | Latein-Kyrillisch | 0.032 | 61 | 44 |
| a U+0061 | а U+0430 | Latein-Kyrillisch | 0.042 | 61 | 45 |
| Quelle | Ziel | Schriften | Mittel | Fonts |
|---|
| ο U+03BF | ჿ U+10FF | Griechisch-Georgisch | 0.057 | 2 |
| ヘ U+30D8 | へ U+3078 | Katakana-Hiragana | 0.122 | 11 |
| 丶 U+4E36 | ヽ U+30FD | Han-Katakana | 0.125 | 9 |
| 二 U+4E8C | ニ U+30CB | Han-Katakana | 0.249 | 11 |
| 口 U+53E3 | ロ U+30ED | Han-Katakana | 0.268 | 11 |
| Bigramm | Ziel | Mittel | Fonts | Anmerkungen |
|---|
| ll | ॥ U+0965 (Devanagari Doppel-Danda) | 0.176 | 8 | Schriftübergreifend |
| oy | ѹ U+0479 (kyrillisch uk) | 0.322 | 16 | Neuartiges schriftübergreifendes Bigramm-Verwechselbarkeitspaar |
| rn | m U+006D | 0.531 | 95 | 33 Schriftarten unter 0,40 |
| bl | ы U+044B (kyrillisch yeru) | 0.797 | 49 | Schriftübergreifend |
| Mittlerer Schwellwert | Einzelzeichen-einzigartige Paare | Multizeichen-einzigartige Paare |
|---|
| < 0,50 | 138 | 13 |
| < 1,00 | 4.174 | 1.631 |
| < 1,50 | 59.700 | (Rauschen) |
| < 2,00 | 249.976 | 2.524.275 |
| Datei | Beschreibung |
|---|
data/output/confusable-discoveries.json | 110 TR39-Paare mit hohem SSIM (>= 0,7) oder pixelidentisch |
data/output/candidate-discoveries.json | 793 neue Paare, die nicht in TR39 sind, mittlerer SSIM >= 0,7 |
data/output/confusable-weights.json | 1.397 gewichtete Kanten für die namespace-guard-Integration |
data/output/cross-script-discoveries.json | 563 schriftübergreifende Verwechselbarkeitspaare |
data/output/cross-script-summary.json | Schriftübergreifende Zusammenfassung nach Schriftpaar |
data/output/multichar-discoveries.json | Multizeichen-Verwechselbarkeitsfunde |
data/output/singlechar-sdf-scores.jsonl | Einzelzeichen-RaySpace-Bewertungen |
data/output/multichar-rayspace-scores.jsonl | Multizeichen-RaySpace-Bewertungen |
data/output/signature-bank/ | Strahlsignaturdatenbank (294.646 Einträge, 7,9 GB komprimiert) |