Для транслитерации кириллицы в русскоязычном интернете реально существует не один, а несколько конкурирующих стандартов: официальный ГОСТ 7.79-2000 (используется, например, в загранпаспортах и МВД), международный ISO 9 (побуквенная схема, однозначно обратимая) и упрощённая «народная» транслитерация, которой фактически пользуется большинство CMS и генераторов слагов. Из-за этого одно и то же слово может дать разные слаги в зависимости от того, какой библиотекой воспользовался разработчик.
Что делает преобразование в slug
- Приводит все буквы к нижнему регистру.
- Заменяет пробелы и знаки препинания на дефисы.
- Транслитерирует кириллицу побуквенно в упрощённом варианте, а не по ГОСТ, — так результат остаётся интуитивно понятным без знания официального стандарта.
- Убирает повторяющиеся дефисы и дефисы в начале и конце строки.
Например, заголовок «Привет, Мир! Как дела?» превращается в нечто вроде privet-mir-kak-dela — с буквой «щ» как shch, если она встречается, поскольку у неё нет однобуквенного латинского эквивалента ни в одном из стандартов.
Почему просто URL-encode не подходит
Percent-encoding (например, %D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82 для кириллицы) технически валиден в URL, но нечитаем для человека и выглядит ненадёжно в адресной строке или при копировании ссылки. Slug решает именно проблему читаемости, а не только технической валидности.
Зачем это нужно
- Автоматически генерировать URL-адрес статьи блога из её заголовка на русском.
- Создать читаемый идентификатор из названия товара для интернет-магазина.
- Сформировать имя файла или CSS-класс из произвольного текста, избежав недопустимых символов.
Коллизии: когда разные заголовки дают одинаковый slug
Заголовки «Привет, мир!» и «привет мир» после нормализации (нижний регистр, удаление пунктуации) превратятся в один и тот же slug privet-mir, хотя исходные тексты разные. Если slug используется как уникальный идентификатор (например, в URL статьи), такую коллизию нужно решать дополнительно — обычно добавлением числового суффикса или ID к дубликату.