Инспектор Unicode

Работает офлайнНичего не загружаетсяБесплатно, без регистрации
КОДОВЫЕ ТОЧКИ0
ЕДИНИЦЫ UTF-160
БАЙТЫ UTF-80
ГРАФЕМЫ0
ПОДОЗРИТЕЛЬНЫЕ0

Инспектируется в этой вкладке — текст её не покидает.

Посмотрите, из чего строка сделана на самом деле: каждая кодовая точка со своим именем — CYRILLIC SMALL LETTER A, ZERO WIDTH SPACE, EGYPTIAN HIEROGLYPH A001 — с блоком, из которого она пришла, байтами UTF-8 и UTF-16, помеченными кириллическими двойниками и четырьмя разными длинами — кодовые точки, единицы UTF-16, байты UTF-8, графемы — объясняющими, почему у одного текста «три длины» в трёх системах.

Четыре линейки для одной строки

Unicode разделяет, чем символ является (кодовая точка), как он хранится (байты UTF-8 или UTF-16) и что видит читатель (графема). Большинство строковых багов — путаница двух из этих линеек: колонка базы, ограниченная в байтах, отвергает текст, посчитанный в символах; substring режет посреди суррогатной пары; курсор шагает через полфлага.

Таблица нарочно на уровне байтов: увидеть C9 99 рядом с ə — полезнее главы объяснений про UTF-8, а увидеть 200B рядом с пустотой — обычно конец двухчасовой отладки.

Имя и заметка отвечают на разные вопросы

Столбец «Имя» говорит, чем символ является; столбец «Заметка» — почему стоит присмотреться именно к этому. Их держат порознь намеренно. Имя — не предупреждение: LATIN SMALL LETTER A и CYRILLIC SMALL LETTER A одинаково почтенные имена, но взглянуть на домен дважды заставляет только второе. Поэтому заметка несёт то, чего имя дать не может: что короткое тире — не дефис, что U+FEFF — ещё и метка порядка байтов, что эта буква — двойник. А там, где заметка только повторила бы имя, она уступает место и помечает строку как подозрительную.

Частые вопросы

Почему у моей строки три разные длины?

Потому что системы считают разное: .length в JavaScript считает единицы UTF-16 (эмодзи — 2), базы данных обычно меряют байты UTF-8 (ə — 2, флаг — 8), а то, что пользователь зовёт одним символом, — графема, которая может быть многими кодовыми точками. Страница печатает все четыре, и расхождение перестаёт быть загадкой.

Что такое пробел нулевой ширины и откуда он в моём тексте?

U+200B — законная подсказка переноса без единой капли чернил: скопируйте фрагмент из свёрстанной веб-страницы или мессенджера — и он приедет следом. Дальше он ломает проверки равенства, логины и SQL-сравнения, выглядя как ничто. Счётчик подозрительных существует в основном ради этого символа.

Что за атака кириллическими двойниками?

Буквы вроде а, е, о, с рендерятся пиксель в пиксель как латинские a, e, o, c, но это другие кодовые точки. Домен или логин, набранный ими, проходит визуальную проверку и проваливает любое сравнение строк — ровно так работает гомографный фишинг. Инспектор называет каждую такую букву.

Почему é — то одна кодовая точка, то две?

Unicode разрешает обе: готовую U+00E9 или e плюс комбинируемый акцент. Они выглядят одинаково и сравниваются как разные — классическая причина, по которой поиск не находит существующий файл. Нормализация (NFC) чинит сравнения; страница показывает, какая форма у вас в руках.

Откуда берутся имена символов?

Из базы символов Unicode — того самого файла, который публикует стандарт. Он не запрашивается у API, а едет вместе со страницей: имена работают офлайн, и ничего о вашем тексте никуда не уходит. Поимённо перечислены 40 470 кодовых точек; ещё примерно 119 000 — китайские иероглифы, корейские слоги, тангутское письмо — стандарт называет по правилу, и страница строит их имена так же. А у суррогатов и символов из области частного использования имени нет вовсе: стандарт им его не даёт, поэтому клетка «Имя» остаётся пустой, а не заполняется догадкой. Выпуск и дата публикации напечатаны под таблицей, потому что пустая клетка «Имя» может означать и то, что на момент этого снимка символ ещё не был назначен.

Почему имена появляются на мгновение позже таблицы?

Таблица имён весит полмегабайта. Она грузится отдельным файлом при первом открытии этого инструмента — так остальные страницы сайта остаются лёгкими, а таблица перед вами рисуется сразу, теми столбцами, которым поиск не нужен. После первого визита браузер держит её в кэше, и инструмент продолжает называть символы вообще без сети.

Похожие инструменты