confusable-vision
Первый в мире набор данных о визуально схожих символах, построенный по шрифтам. Какие символы Unicode на какие похожи, измерено по контурам шрифтов, а не по пикселям. Текущий выпуск, 2026.09.26, сравнивает каждую букву и цифру, которые рисует каждый из 322 шрифтов, в том размере и положении на базовой линии, которые глиф имеет в обычном тексте. Затем похожие на ASCII-буквы и цифры символы проверяются на месте: помещённые между другими буквами в распространённых шрифтах в том размере, в котором люди их читают, и сравнённые с парами, которые все признают похожими, например 0 и O.
addons.mozilla.org использует символы из confusable-vision для проверки имён дополнений на похожие символы, с указанием авторства в исходном коде Mozilla; см. Используется в.

Используется в
- Mozilla addons-server, код, лежащий в основе addons.mozilla.org, добавляет символы из выходных данных confusable-vision в таблицу, которую использует для сведения похожих символов к ASCII при проверке имён дополнений:
src/olympia/amo/confusables.py, пул-реквесты #24468, #24541, #24612 и #24665 (с февраля по март 2026).
- disarm (raeq/disarm), который канонизирует враждебный Unicode до того, как он достигнет классификаторов, индексов и идентификаторов, добавляет измеренные пары из confusable-vision в свои таблицы похожих символов:
data/confusables_supplement.tsv, data/confusables_vision.tsv.
- SilverSpeak (ACMCMC/silverspeak), библиотека Python для проведения и нейтрализации гомоглифных атак на текст, строит визуальных соседей в своём графе гомоглифов из файлов обнаружений confusable-vision (
docs/hkb.md).
- namespace-guard поставляет измеренные пары, и через него они доходят до agent-sanitizer, который использует namespace-guard как движок по умолчанию для сведения похожих символов во входных данных вызовов инструментов ИИ-агента к ASCII (deps.dev).
Эти проекты взяли свои данные из выходных данных confusable-vision за февраль и март 2026.
Обсуждалось на Hacker News: I rendered 1,418 confusables over 230 fonts и Confusables.txt and NFKC disagree on 31 characters.
Выпуск 2026.09.26 в цифрах:
- 322 шрифта: каждый шрифт в macOS, включая те, что она загружает по требованию, например PingFang, плюс Roboto, Noto Sans, Noto Serif, Noto Sans CJK и DejaVu. 64 751 кодовая позиция в 140 письменностях.
- 11 517 пар, похожих хотя бы в одном шрифте или комбинации шрифтов, из которых 5 975 проходят предлагаемые пороги.
- 719 пар символа и двухбуквенной ASCII-последовательности, например ǁ и ll, или Ы и bl.
- 3 055 кандидатов в похожие на ASCII-буквы, цифры и последовательности, проверенных на месте: 646 похожи на строгом уровне, ещё 358 на широком уровне, ещё 101 совпадают с начертанием буквы в другом распространённом шрифте. 224 из строгих отсутствуют в confusables.txt Unicode.
Данные опубликованы как версионированный выпуск в data/release/2026.09.26/ (CC-BY-4.0). На нём построены namespace-guard и d0ma1n.
Что изменилось с выпуска 2
Выпуск 2 (2026.09.24, и 2026.09.25 для данных TLD) сравнивал только те пары и шрифты, которые сравнивали предыдущие прогоны. Аудит идентичных глифов показал, что он поймал 637 из 2 654 случаев, когда шрифт рисует два символа одним и тем же глифом. Выпуск 3 исправляет это и добавляет три вещи:
- Покрытие. Каждая буква и цифра, которые рисует каждый шрифт, сравнивается с каждой другой в этом шрифте, включая хань и хангыль. Выпуск 2 брал свои символы из фиксированного списка, поэтому он никогда не доходил до большей части письменностей и, канадского слогового письма, эфиопской или индийских письменностей, и он пропускал шрифты только для отдельных письменностей и PingFang.
- Правильные начертания. Коллекции шрифтов загружаются в том начертании, которое браузер использует для основного текста. Ранние прогоны брали первое начертание, которое для некоторых коллекций было полужирным, чёрным или курсивным.
- Перекрывающиеся контуры, как в вариативных шрифтах вроде San Francisco, измеряются как объединение их штрихов, как их видит читатель.
- Двухбуквенные последовательности. Каждая последовательность из двух ASCII-букв или цифр (3 844) набирается так, как её набирает каждый шрифт, с её кернингом и лигатурами, и сравнивается как символ.
- Межшрифтовой порог задаётся верхним квартилем страничных шрифтов, поэтому добавление шрифтов в обзор не может его сдвинуть.
- Проверка на месте (ниже).
Цифры за март 2026 (249 976 пар одиночных символов и 2 524 275 пар биграмм по 245 шрифтам) получены из измерений, игнорировавших размер и базовую линию. Они устарели; файлы тех прогонов остаются в data/output/ для справки.
Как это работает
Измерение глифов
RaySpace пускает параллельные лучи через контур каждого глифа под 36 углами, по 50 лучей каждый, и записывает пять вещей на луч: сколько раз он пересекает контур, где, под каким углом, как далеко он каждый раз проходит через штрих (его пинг, ширину штриха вдоль луча) и самый широкий промежуток между штрихами. Каждый глиф измеряется дважды: в собственной рамке, для формы, и в фиксированной рамке на базовой линии, чтобы учитывались размер и положение. Два символа похожи в шрифте, когда расстояние по форме ниже 0.5, а расстояние с привязкой к базовой линии ниже 0.2. Сравнение выполняется на Rust (native/cv-pairs), на всех ядрах.
- Внутри одного шрифта: каждая пара букв и цифр, которые рисует шрифт.
- Между шрифтами: символ в своём шрифте, как его нарисовал бы запасной шрифт браузера, против 62 ASCII-букв и цифр каждого из 26 страничных шрифтов, в которых он отсутствует. Он засчитывается, когда ASCII-буква оказывается ближайшей, и символ так же близок к ней, как эта буква к самой себе в верхнем квартиле остальных страничных шрифтов.
- Последовательности: каждый символ против 3 844 двухсимвольных ASCII-последовательностей, как их набирает каждый шрифт (Core Text; HarfBuzz набирает их идентично, за исключением трекинга системного шрифта).
Проверка на месте