Метрики эмодзи CreepJS: множества и суммы
Что означают emojiSet и textMetricsSystemSum в коде CreepJS: представители, свёртка с потерями и условия включения полей не удостоверяют ОС.
BotBrowser Team
Нужна структурированная документация по теме Отпечатки?
Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.
Метрики эмодзи CreepJS описывают геометрию текста и её группировку библиотекой. Названия emojiSet и textMetricsSystemSum не превращают измерения в удостоверение операционной системы. BotBrowser документирует профильные шрифты и резервные шрифты для эмодзи, но не гарантирует одинаковые значения всех текстовых метрик и не устанавливает ОС по сводному значению CreepJS.
Основанием служит публичный код ревизии 10aa6724cd33a1015db1574211890518cd04f0cc, изученный 2026-11-02. Указанный блок canvas выбирает представителей и вычисляет сумму; блок сборки решает, какие поля сохранить. Ни один не назначает метку ОС. Это разбор исходного кода, а не выполненное сравнение браузеров и не утверждение обо всех выводах в других частях CreepJS.
Кратко
emojiSetсохраняет первый встреченный эмодзи для каждого различающегося кортежа из семи текстовых метрик. Это не полный список поддерживаемых эмодзи.textMetricsSystemSumагрегирует уникальные кортежи, а не взвешивает каждый входной эмодзи отдельно. Свёртка теряет информацию.- Сборщик проверяет
liedдля пиксельных полей и отдельноliedTextMetricsдля метрических. Для объяснения отсутствия нужен контекст ветки. - Равная геометрия не устанавливает равенство пикселей, файла шрифта или ОС. Классификатору ОС нужны дополнительные основания за пределами этих блоков.
- Перед сравнением свёрток сопоставьте ревизию, состав метрик и этап включения. Не помещайте сырые данные отпечатка в обычные журналы поддержки.
Содержание
- Семь метрик описывают геометрию
- Представители не образуют перечень поддержки
- Сумма отбрасывает исходную структуру
- Пиксельные и метрические поля имеют разные условия
- Сравнение отчётов требует происхождения данных
- Возможности шрифтов BotBrowser имеют более узкие границы
- Практический вывод
Семь метрик описывают геометрию
Измеряемый объект не является изображением
Зафиксированный исходный код 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. Метрическая ветка способна создать объект, даже если пиксельная его не дала. Путь объясняет возможное сочетание полей, но не устанавливает путь конкретного скачанного отчёта без окружающих данных модуля и экспорта.
Источники
- CreepJS: зафиксированный модуль canvas
- CreepJS: зафиксированная сборка результата
- MDN: CanvasRenderingContext2D.measureText()
- MDN: TextMetrics
- CSS Fonts: алгоритм подбора шрифтов
- Unicode: спецификация эмодзи
- BotBrowser: документация шрифтов
Практический вывод
Считайте emojiSet представителями уникальной геометрии, а textMetricsSystemSum считайте сводкой с потерями; перед объяснением отсутствующего поля установите этап включения. Сохраняйте ревизию и происхождение объекта для разрешённых сравнений. Для дефектов отрисовки нужны прямые данные приложения, а для метки ОС требуется отдельное обоснование: эти блоки не дают ни перечня поддержки, ни идентичности устройства.
Эта статья входит в руководство: Что такое отпечаток браузера?
Похожие статьи
Fingerprinting измерения текста: субпиксельное отслеживание
ОтпечаткиОтчёт CreepJS WebGL: контексты и сигналы
ОтпечаткиПредсказание CreepJS: агрегация и неизвестные состояния
ОтпечаткиЧто такое отпечаток шрифтов? Согласованность текста между платформами
ОтпечаткиОтпечаток getClientRects: согласованность DOMRect
ОтпечаткиОтчёт Intl CreepJS: поля и отсутствующие значения
Переведите BotBrowser из исследований в продакшн
Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.