
793 путаемые пары, отсутствующие в Unicode TR39, первый в мире межскриптовый набор данных, шрифтозависимая оценка SSIM для 230 шрифтов и более 22 000 символов
Эмпирическая оценка сходства глифов с помощью векторного рейкастинга. Визуализирует конфьюзабельные пары символов Unicode на 245 системных шрифтах, измеряет структурное сходство напрямую по контурам шрифта (без растеризации) и создает оценённые JSON-артефакты с непрерывными показателями расстояния для каждого шрифта.
Ключевые результаты из 52,6 миллионов односимвольных и 190 миллионов многосимвольных сравнений для 22 581 символа и 12 систем письма:
Выходные данные напрямую подаются в namespace-guard для обнаружения конфьюзабельных символов во время выполнения в именах пакетов, доменных именах и идентификаторах.
RaySpace испускает параллельные лучи через контуры шрифта под 36 углами и захватывает пять слоёв информации для каждого глифа: количество пересечений, позиции пересечений, углы пересечений, ping-расстояния (ширина штриха в каждом пересечении) и ping max (ширина промежутка между пересечениями). Это создаёт компактную сигнатуру для каждого символа в каждом шрифте. Две сигнатуры сравниваются с помощью взвешенного L1-расстояния по всем пяти слоям.
Трёхступенчатый каскад фильтров делает полное сравнение осуществимым:
Банк сигнатур (294 646+ записей для 245 шрифтов; больше с --include-uppercase) предварительно вычисляется один раз. Затем обнаружение выполняется как однопоточные арифметические операции над банком, завершая 52,6 миллиона сравнений пар за 31 минуту без рабочих потоков или GPU.
npm install
# 1. Построить банк лучевых сигнатур (обязательно, ~24 мин)
npx tsx scripts/build-signature-bank.ts
# 1b. Включить заглавные буквы латиницы A–Z (опционально)
# По умолчанию банк включает только IDNA PVALID кодовые точки (строчные,
# цифры, символы). Используйте --include-uppercase для добавления заглавных A-Z, полезно
# для идентификации шрифтов и визуального сравнения товарных знаков, где важны
# формы заглавных глифов. Сборщик возобновляем, поэтому будут вычисляться только
# дополнительные кодовые точки.
npx tsx scripts/build-signature-bank.ts --include-uppercase
# 1c. Включить произвольные диапазоны кодовых точек (опционально)
npx tsx scripts/build-signature-bank.ts --extra-range=0041-005A
# 2. Обнаружение односимвольных пар (22 581 символ, 12 систем письма, ~36 мин)
npx tsx scripts/discover-singlechar-sdf.ts --scorer=ray
# 3. Обнаружение многосимвольных пар (биграммы) (676 биграмм, ~63 мин)
npx tsx scripts/discover-multichar-sdf.ts --scorer=ray
# 4. Оценка известных многосимвольных конфьюзабельных пар из TR39 (~5 мин)
npx tsx scripts/score-multichar-sdf.ts --scorer=ray
Исходный конвейер на основе SSIM оценил 26,5 миллионов сравнений для 230 шрифтов. Он остаётся работоспособным, но заменён RaySpace для всех задач обнаружения и оценки.
# Оценка конфьюзабельных пар из TR39
npx tsx scripts/build-index.ts # Построить индекс (~160 с, 11 370 PNG)
npx tsx scripts/score-all-pairs.ts # Оценить все пары (~65 с, 235 000 сравнений)
# Обнаружение новых конфьюзабельных пар
npx tsx scripts/build-candidates.ts # Набор кандидатов (~23 000 символов)
npx tsx scripts/build-index.ts --candidates # Визуализировать кандидатов (~40 мин, 89 000 PNG)
npx tsx scripts/score-candidates.ts # Оценить по отношению к латинским целям (~15 мин, 2,9 млн сравнений)
# Извлечь высокооценённые открытия из обоих конвейеров
npx tsx scripts/extract-discoveries.ts
| Источник | Цель | Системы письма | Среднее | Шрифты | Нули |
|---|---|---|---|---|---|
| w U+0077 | ԝ U+051D | Latin-Cyrillic | 0,000 | 19 | 19 |
| j U+006A | ϳ U+03F3 | Latin-Greek | 0,013 | 21 | 18 |
| i U+0069 | і U+0456 | Latin-Cyrillic | 0,018 | 62 | 50 |
| s U+0073 | ѕ U+0455 | Latin-Cyrillic | 0,018 | 62 | 46 |
| c U+0063 | с U+0441 | Latin-Cyrillic | 0,019 | 61 | 45 |
| o U+006F | о U+043E | Latin-Cyrillic | 0,020 | 61 | 44 |
| j U+006A | ј U+0458 | Latin-Cyrillic | 0,021 | 60 | 48 |
| x U+0078 | х U+0445 | Latin-Cyrillic | 0,023 | 59 | 50 |
| p U+0070 | р U+0440 | Latin-Cyrillic | 0,024 | 61 | 46 |
| e U+0065 | е U+0435 | Latin-Cyrillic | 0,032 | 61 | 44 |
| a U+0061 | а U+0430 | Latin-Cyrillic | 0,042 | 61 | 45 |
«Нули» = шрифты, в которых контуры дают побитно идентичные лучевые сигнатуры (расстояние 0,000). Латинская w и кириллическая ԝ идентичны во всех 19 шрифтах, содержащих оба глифа.
| Источник | Цель | Системы письма | Среднее | Шрифты |
|---|---|---|---|---|
| ο U+03BF | ჿ U+10FF | Greek-Georgian | 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 |
Грузинская Coda (U+10FF) образует четырёхстороннее кольцо конфьюзабельности с латинской o, кириллической o и греческим омикроном — все с расстоянием ниже 0,08.
| Биграмма | Цель | Среднее | Шрифты | Примечания |
|---|---|---|---|---|
| ll | ॥ U+0965 (деванагари двойная данда) | 0,176 | 8 | Межсистемная |
| oy | ѹ U+0479 (кириллическая uk) | 0,322 | 16 | Новая межсистемная биграммная конфьюзабельная |
| rn | m U+006D | 0,531 | 95 | 33 шрифта ниже 0,40 |
| bl | ы U+044B (кириллическая ы) | 0,797 | 49 | Межсистемная |
Открытие oy/кириллическая uk является выдающимся новым результатом: латинская биграмма «oy» визуально идентична кириллической букве-диграфу uk (ѹ) с расстоянием 0,000 в Helvetica и 0,0005 в Arial Unicode MS.
| Средний порог | Односимвольные уникальные пары | Многосимвольные уникальные пары |
|---|---|---|
| < 0,50 | 138 | 13 |
| < 1,00 | 4 174 | 1 631 |
| < 1,50 | 59 700 | (шум) |
| < 2,00 | 249 976 | 2 524 275 |
Три рекомендуемых рабочих уровня:
Узнайте, какие конфьюзабельные пары существуют для конкретного шрифта. Полезно для дизайнеров шрифтов, выпускающих новый гарнитур, вендоров браузеров, оценивающих смену системного шрифта, или любого, кто выбирает экранный шрифт для чувствительных к безопасности контекстов, таких как IDN-домены.