Привет, Хабр!
Давайте начнём с простого вопроса.
Под полем регистрации написано «ник, не больше 12 символов». Что здесь значит слово «символ»?
Если вы сейчас мысленно ответили «ну, символ», то вы в хорошей компании: браузер, бэкенд и колонка в базе тоже уверены, что знают ответ.
Просто у каждого он свой. Так вышло из‑за возраста языков.
Java и JavaScript проектировали в середине 90-х, когда Unicode помещался в 16 бит, и длину строки они до сих пор считают в 16-битных единицах.
Go и Rust хранят строки в UTF-8 и меряют их байтами.
Python считает кодовые точки, PostgreSQL тоже.
А человек смотрит на экран и видит четвёртую величину, графемы, и для неё долго вообще не было стандартного счётчика.
Пока в нике латиница и кириллица, все четыре числа живут мирно. Потом приходит пользователь с семейным эмодзи и флагом, и ник из 5 видимых знаков внезапно имеет 4 разные длины.
Одно и то же ограничение в 12 символов два слоя системы пропускают, а четыре отвергают. И это мы ещё ничего не обрезали.
Четыре длины одной строки
Вот наш подопытный: Аня
