Назад в Центр знаний
Отпечатки

Метрики эмодзи CreepJS: множества и суммы

Что означают emojiSet и textMetricsSystemSum в коде CreepJS: представители, свёртка с потерями и условия включения полей не удостоверяют ОС.

BotBrowser Team

Документация

Нужна структурированная документация по теме Отпечатки?

Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.

Метрики эмодзи CreepJS описывают геометрию текста и её группировку библиотекой. Названия emojiSet и textMetricsSystemSum не превращают измерения в удостоверение операционной системы. BotBrowser документирует профильные шрифты и резервные шрифты для эмодзи, но не гарантирует одинаковые значения всех текстовых метрик и не устанавливает ОС по сводному значению CreepJS.

Основанием служит публичный код ревизии 10aa6724cd33a1015db1574211890518cd04f0cc, изученный 2026-11-02. Указанный блок canvas выбирает представителей и вычисляет сумму; блок сборки решает, какие поля сохранить. Ни один не назначает метку ОС. Это разбор исходного кода, а не выполненное сравнение браузеров и не утверждение обо всех выводах в других частях CreepJS.

Кратко

  • emojiSet сохраняет первый встреченный эмодзи для каждого различающегося кортежа из семи текстовых метрик. Это не полный список поддерживаемых эмодзи.
  • textMetricsSystemSum агрегирует уникальные кортежи, а не взвешивает каждый входной эмодзи отдельно. Свёртка теряет информацию.
  • Сборщик проверяет lied для пиксельных полей и отдельно liedTextMetrics для метрических. Для объяснения отсутствия нужен контекст ветки.
  • Равная геометрия не устанавливает равенство пикселей, файла шрифта или ОС. Классификатору ОС нужны дополнительные основания за пределами этих блоков.
  • Перед сравнением свёрток сопоставьте ревизию, состав метрик и этап включения. Не помещайте сырые данные отпечатка в обычные журналы поддержки.

Содержание

Пять этапов кода: measureText даёт семь метрик, pattern хранит различные кортежи, emojiSet выбирает представителей, textMetricsSystemSum сворачивает уникальные кортежи, а liedTextMetrics управляет включением. Ни один этап этих блоков не назначает метку ОС.

Семь метрик описывают геометрию

Измеряемый объект не является изображением

Зафиксированный исходный код canvas в CreepJS вызывает context.measureText(emoji) и читает семь свойств: actualBoundingBoxAscent, actualBoundingBoxDescent, actualBoundingBoxLeft, actualBoundingBoxRight, fontBoundingBoxAscent, fontBoundingBoxDescent и width. Значения объединяются в представление кортежа. Ключом удаления повторов становится именно кортеж, а не нарисованное изображение эмодзи.

Справка MDN по measureText описывает возвращаемый объект TextMetrics. Справка по TextMetrics различает ширину продвижения и размеры ограничивающих прямоугольников, указывая единицы в CSS-пикселях. Поэтому совпадение только width слабее совпадения всех семи выбранных свойств. Ни одно сравнение не охватывает отдельные цвета и краевые пиксели отрисованного глифа.

Это существенно, когда два отчёта говорят, что эмодзи «совпадает». Один может подразумевать равную ширину, другой подразумевает равный выбранный кортеж, третий сравнивает изображение. У сравнений разные входные данные. Разбор отпечатков по измерению текста разделяет геометрию, растровый результат и состояние загрузки шрифтов. Утверждение о равенстве должно называть слой, а не переносить метрическое совпадение на изображение.

Подбор шрифта как отдельная зависимость

Спецификация сопоставления CSS Fonts описывает выбор шрифта и резервные варианты. Запрошенное семейство само по себе не доказывает, что каждый символ взят из одного файла. Геометрия measureText() поэтому не является перечнем файлов. Сравнение кортежей не восстанавливает незаписанный путь подбора только потому, что имя семейства присутствовало в настройке canvas.

Спецификация эмодзи Unicode различает запросы текстового представления и представления эмодзи. Представление и резервные шрифты важны как контекст, но выбранные свойства TextMetrics всё равно измеряют получившуюся раскладку текста. В записи поддержки не следует заменять фактическую входную последовательность похожим снимком: визуальное сходство не сохраняет исходный запрос представления.

Представители не образуют перечень поддержки

Выбор следует кортежу, а не вердикту о поддержке

В src/canvas/index.ts:369-394 CreepJS ведёт множество pattern. Эмодзи попадает в emojiSet, только если его кортеж размеров ещё не встречался. Если последующий вход даёт известный кортеж, новый представитель не добавляется. Отсутствие такого эмодзи в emojiSet совместимо с успешным измерением; ветка не требует признать глиф неподдерживаемым.

Гипотетическая группировка поясняет следствие. Пусть две разные входные строки дают одинаковую выбранную геометрию, а ещё одна даёт другой кортеж. В представителях останется один участник первой группы и один второй. Это не устанавливает недоступность отброшенного участника и не доказывает, что оставшиеся обозначают два файла шрифта. Правило группировки относится только к равенству выбранных свойств.

Порядок тоже играет ограниченную, но важную роль. Поскольку emojiSet получает первого встреченного участника каждого нового шаблона, перестановка входов может изменить представителя, не меняя коллекцию уникальных кортежей. Поэтому различие списков представителей недостаточно для вывода об изменении среды. Сначала нужно подтвердить сопоставимость ревизии и входной последовательности.

Матрица от кода к выводу

Следующая матрица помогает интерпретировать код и не является выводом браузера. Каждая строка ограничивает вывод своего этапа; более поздний классификатор нельзя приписывать предыдущему этапу лишь потому, что он использует его данные.

ЭтапОперация кодаПолученный объектОбоснованное толкованиеНеобоснованный вывод
ИзмерениеЧтение семи свойств TextMetricsКортеж геометрииВыбранная геометрия текстаИдентичность ОС
Удаление повторовДобавление новых кортежей в patternРазличные шаблоныРазличные выбранные измеренияРазные файлы шрифта
Выбор представителейПервый участник каждого шаблонаemojiSetПредставители метрических группПолная поддержка эмодзи
АгрегацияСвёртка уникальных кортежейtextMetricsSystemSumМетрическая сводка с потерямиОбратимая идентичность устройства
Сборка результатаОтдельная проверка liedTextMetricsВключённые метрические поляРешение о включении в данном кодеВердикт внешнего сервиса

Правило устраняет частую ошибку отчёта: нельзя считать участников emojiSet установленными шрифтами, а отсутствующих считать неработающими глифами. Если проблема заключается в нечитаемом сообщении, число метрических групп не отвечает, правильно ли отображается нужная последовательность. Исследуйте видимое поведение разрешённого приложения, а не используйте поле отпечатка как тест поддержки глифов.

Сумма отбрасывает исходную структуру

Уникальные группы, а не частотные веса

Агрегация в src/canvas/index.ts:396-399 перебирает pattern, множество представлений уникальных кортежей. Повторные входы с уже существующим кортежем не добавляют на этом этапе новую копию. Поэтому итог не измеряет частоту определённой геометрии во входной коллекции. Толкование с равным вкладом каждого исходного входа описывает другой алгоритм.

Преобразование и свёртка дополнительно сжимают различия. Опубликованная реализация превращает компоненты кортежа в числа и перед сложением подставляет ноль для ложных в булевом контексте результатов числового преобразования. Наличие сводного результата не доказывает, что каждое свойство присутствовало с ненулевым конечным значением. Доступность исходных свойств и числовая сводка являются разными фактами; вторая не восстанавливает первый.

Сложение теряет расположение компонентов. Разные кортежи могут иметь равный итог, а разные коллекции могут иметь одинаковый агрегат. Это аргумент о потере информации при сложении, не измеренная частота коллизий и не исследование популяции браузеров. Из существования суммы не следуют процент уникальности, уверенность идентификации или точность определения ОС.

Генерация пикселей идёт другим путём

Модуль canvas также формирует отрисованные данные, но textMetricsSystemSum не является свёрткой всех пикселей изображения эмодзи. Сравнения метрик и пикселей должны иметь отдельные названия результатов. Отчёт, называющий оба случая «canvas совпал», не отличает равенство раскладки от равенства растра, даже если исходный сборщик сохранял это различие.

Анализ начального значения canvas CreepJS рассматривает детерминированные запросы рисования и их связь с отрисованным результатом. Он не заменяет вопрос метрической группировки: известная последовательность рисования не определяет, какие текстовые кортежи объединятся. И наоборот, равная геометрия представителей не доказывает одинаковые запросы рисования, изображения или последующий конвейер агрегации.

В разрешённом сравнении совместимости сохраняйте исходный вопрос. Для неожиданного переноса строки важны width и контекст раскладки. Для нечитаемого эмодзи важно видимое изображение глифа. Агрегат способен отметить различие отчётов, не объясняя ни одну проблему пользователя. Замена инцидента оценкой отпечатка отбросила бы данные, необходимые для исправления приложения.

Пиксельные и метрические поля имеют разные условия

Включение не является общим переключателем canvas

Зафиксированная сборка результата сначала возвращается без результата, если входной результат модуля canvas2d отсутствует. Если он доступен, два условия обрабатываются независимо. Ветка !lied включает dataURI, paintURI, textURI и emojiURI. Ветка !liedTextMetrics включает textMetricsSystemSum и emojiSet.

Отрицание JavaScript существенно: и !lied, и !liedTextMetrics допускают любое ложное значение в булевом контексте, не только буквальное логическое false. Код задаёт условия включения; он не позволяет трактовать отсутствующий флаг как выполненную проверку. Аналогично, lied и liedTextMetrics являются идентификаторами библиотеки, а не выводами о честности или намерениях человека.

Вторая ветка сохраняет данные первой либо начинает новый объект, если их нет. Поэтому метрические поля могут попасть в результат, даже когда пиксельная ветка не заполнила свои поля. Экспортёр, объединяющий эти случаи под меткой «canvas отклонён», уничтожает различие, существующее в указанном коде.

Пропущенные поля требуют окружающих данных

Доступное основаниеОграниченное толкованиеЧего ещё не хватает
Нет входного результата canvas2dБлок возвращается без результата этого модуляПричина отсутствия модуля
Пиксельная ветка исключена, метрическая включенаГруппы обрабатываются независимоКлассификация ОС или сравнение пикселей
Результат модуля есть, метрическое условие не допускает поляНа этом этапе метрики не включеныВозможное дополнительное преобразование при экспорте
В скачанном отчёте нет emojiSetВ исследованном отчёте поле не видноРезультат модуля, ветка включения и история экспорта

Строки описывают случаи из кода, а не воспроизведённые запуски. В частности, отсутствие emojiSet в скачанном отчёте не выбирает третью строку без результата модуля и состояния ветки. Фильтрация экспорта, изменение схемы и недоступный результат модуля остаются разными возможностями. Относите наблюдение к исследованному слою, а не выводите раннее событие из пустого конечного поля.

Сравнение отчётов требует происхождения данных

Ревизия кода входит в условия сравнения

Записывайте фиксированную ревизию CreepJS рядом с именем поля. 10aa6724cd33a1015db1574211890518cd04f0cc определяет рассмотренный код; ссылка на изменяемую ветку не подтверждает одинаковый состав кортежа и сборщик другого отчёта. Одна дата тоже не устанавливает, какие байты отдавала страница. Ограничение действует и при одинаковых названиях в двух экспортах.

Этап наблюдения должен сопровождать ревизию. Объект модуля canvas, собранный объект отпечатка и скачанный отчёт могут содержать разные поля. Прежде чем толковать отсутствие textMetricsSystemSum, установите, какой объект находится во вложении поддержки и не удалило ли преобразование или переименование поле. Если происхождение не сохранено, оставьте причину неизвестной, а не придумывайте историю выполнения.

Для разрешённого сравнения существующих записей таблица задаёт минимальную заметку о происхождении. Это рекомендуемые поля поддержки, а не формат экспорта CreepJS и не записи, автоматически выдаваемые BotBrowser. Сохраняйте лишь необходимое для задачи; ссылка на вложение под контролем пользователя может быть предпочтительнее копирования сырых метрических векторов в обычную аналитику.

Поле поддержкиКакой вопрос решаетГраница сбора
Ревизия кодаКакая реализация рассматривается?Фиксировать реальную ревизию, не предполагаемую текущую ветку
Этап объектаМодуль, собранный объект или экспорт?Не выводить ненаблюдавшееся раннее состояние
Состав метрикВыбраны ли те же семь свойств?Записать схему перед сбором сырых значений
Семантика представителейПервый участник каждого уникального кортежа?Не переименовывать представителей в поддержку шрифтов
Видимый симптомПеренос, отсутствующий глиф или только отчёт?Отделять проблему приложения от заявлений об идентичности

Метка ОС требует собственных оснований

Ни один указанный блок не содержит недостающего шага классификации. Отчёту с меткой ОС нужны отдельно определённое правило, входные данные и основания проверки этого утверждения. Соседство textMetricsSystemSum и метки не доказывает, что именно сумма однозначно её определила. Метка позднего компонента не является выводом, документированным для measureText().

Утверждения о популяции требуют ещё одной категории данных. Чтение кода не устанавливает частоту значения среди реальных пользователей и влияние версии браузера на распределение. Исследования популяции здесь не проводилось. Неформальное слово «system» в имени переменной не означает измеренную точность идентификации, устойчивость между устройствами или гарантию отсутствия одинаковых значений у разных установок.

Возможности шрифтов BotBrowser имеют более узкие границы

Документация шрифтов BotBrowser описывает профильные наборы шрифтов, межплатформенную отрисовку и соответствующие платформе резервные эмодзи. Это возможности продукта, не утверждения репозитория CreepJS, MDN или Unicode. Та же страница прямо допускает отличия некоторых измерений раскладки; настройка профиля не гарантирует равный результат для каждого глифа или свойства измерения текста.

Разрешённое приложение может использовать объявленный профиль для проверки конкретного требования к раскладке или отрисовке. Условие приёмки должно называть это требование: читаемо ли сообщение и переносится ли известная строка согласно макету. Нельзя заменять корректность приложения фразой «CreepJS определил нужную ОС» или выводить успешную загрузку профиля только из совпадения emojiSet.

Страница документации и разбор кода отвечают на разные вопросы. Страница объясняет настройки и ограничения. Матрица объясняет, как одна публичная реализация сворачивает метрики и включает поля. Разделение областей не позволяет превратить описание управления продуктом в обещание результата внешнего классификатора или представить поле стороннего сборщика как документированный вывод BotBrowser.

Вопросы

Более короткий emojiSet означает меньше поддерживаемых эмодзи?

Нет. Выбор в указанном блоке следует новым метрическим кортежам. Несколько измеряемых входов могут разделять кортеж и оставлять в emojiSet только первого представителя. Для инвентаризации поддержки нужны другая проверка и данные о нужных глифах; число представителей этого не даёт.

Равные суммы устанавливают одну операционную систему?

Нет. textMetricsSystemSum сжимает уникальные кортежи и отбрасывает их расположение. Два блока не назначают метки ОС; проверка на популяции браузеров не заявляется. Позднему классификатору нужны собственные основания; равенство агрегата не удостоверяет ОС, физическое устройство или человека.

Почему метрики могут оставаться без пиксельных полей?

Сборщик отдельно проверяет lied и liedTextMetrics. Метрическая ветка способна создать объект, даже если пиксельная его не дала. Путь объясняет возможное сочетание полей, но не устанавливает путь конкретного скачанного отчёта без окружающих данных модуля и экспорта.

Источники

Практический вывод

Считайте emojiSet представителями уникальной геометрии, а textMetricsSystemSum считайте сводкой с потерями; перед объяснением отсутствующего поля установите этап включения. Сохраняйте ревизию и происхождение объекта для разрешённых сравнений. Для дефектов отрисовки нужны прямые данные приложения, а для метки ОС требуется отдельное обоснование: эти блоки не дают ни перечня поддержки, ни идентичности устройства.

#CreepJS#Emoji Metrics#Font Fingerprinting#Canvas#приватность

Эта статья входит в руководство: Что такое отпечаток браузера?

Переведите BotBrowser из исследований в продакшн

Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.