Что это за инструмент?
Для обычного ASCII-текста (английские буквы, цифры, базовая пунктуация) количество символов и количество байтов совпадают — каждый символ занимает ровно один байт в UTF-8. Как только текст включает буквы с диакритикой, китайские/японские/корейские символы, кириллицу, арабский текст, эмодзи или большинство других не-ASCII символов, это перестаёт быть верным: один символ может занимать 2, 3 или 4 байта в UTF-8, и 2 или 4 байта в UTF-16.
Это важно везде, где у системы есть ограничение в байтах, а не в символах — SMS-сообщения, размеры столбцов баз данных, ограничения полезной нагрузки API и некоторые социальные платформы измеряют всё в байтах, а не в символах, поэтому один и тот же текст может незаметно превысить лимит в зависимости от того, какой язык или символы он содержит.
Зачем его использовать?
- Разрабатываете интеграцию с API X (Twitter) и хотите понять, почему пост на русском с кириллицей упирается в лимит по байтам при небольшом числе символов — сравнение количества символов и байтов UTF-8 сразу показывает разницу.
- Работаете над многоязычным интернет-магазином и нужно проверить, поместится ли название товара на русском в столбец базы данных VARCHAR(255), если ограничение задано в байтах, а не в символах.
- Внедряете систему SMS-уведомлений для зарубежных клиентов и хотите заранее оценить, на сколько сегментов разобьётся сообщение с эмодзи и кириллицей перед реальной отправкой.
- Разбираетесь с ошибкой лимита размера payload в API и заметили, что текст на русском выглядит коротким, а число байтов почему-то большое.
- Пытались зарегистрировать имя пользователя с эмодзи в зарубежной системе и получили предупреждение, что осталось меньше места, чем ожидалось — можно посмотреть, сколько байтов и кодовых единиц эмодзи реально занимает внутри.
- Даже работая с клиентскими данными или строками внутренней корпоративной системы, текст обрабатывается только в браузере, так что можно проверить, ничего никуда не отправляя.
Как использовать
- Введите или вставьте текст в поле.
- Прочитайте количество символов, количество байтов UTF-8 и количество байтов UTF-16 под ним — они обновляются по мере набора.
Пример
Ввод
Hello, 世界! 🌍Результат
12 символов, 19 байт UTF-8, 26 байт UTF-16ASCII-часть («Hello, » и «! ») занимает 1 байт на символ в UTF-8. Каждый китайский иероглиф занимает 3 байта, а эмодзи — 4 байта, поэтому число байтов заметно выше числа символов.
Типичные сценарии использования
- Проверка, поместится ли многоязычное описание товара в столбец базы данных, определённый по длине в байтах, а не по количеству символов.
- Оценка использования сегментов SMS, поскольку SMS тарифицируется и делится по размеру в байтах, а для нелатинского текста действует другой лимит на сегмент.
- Проверка, что полезная нагрузка API или поле формы остаются в пределах ограничения по байтам перед отправкой.
- Понимание того, почему строка, которая «выглядит короткой», отклоняется системой с проверкой длины на основе байтов.
Сколько байтов в UTF-8 занимает каждый тип символа
Даже если это «1 символ» в обоих случаях, число байтов в UTF-8 сильно различается в зависимости от типа символа. Ориентировочные значения ниже.
| Тип символа | Байтов в UTF-8 | Пример |
|---|---|---|
| Латинские буквы и цифры без диакритики, базовая пунктуация | 1 байт | A, 1, !, пробел |
| Кириллица, буквы с диакритикой, греческий алфавит | 2 байта | а, é, Ж |
| Символы CJK (китайский, японский, корейский) | 3 байта | 中, あ, 한 |
| Эмодзи и некоторые специальные символы | 4 байта | 🌍, 🎉 |
Часто задаваемые вопросы
Почему количество символов и количество байтов не совпадают?
Текст в Unicode хранится в виде байтов, и сколько байтов требуется для каждого символа, зависит от кодировки и самого символа. В UTF-8 символы ASCII занимают 1 байт, большинство букв с диакритикой в латинице, а также кириллица/греческий/иврит/арабский занимают 2 байта, большинство символов CJK занимают 3 байта, а эмодзи обычно занимают 4 байта. Счётчик символов просто считает знаки, не заботясь о том, как они хранятся.
Какое количество байтов использовать для поля с ограничением в байтах?
Используйте ту кодировку, которую система реально применяет для хранения или передачи текста — большинство современных веб-API, баз данных и файлов используют UTF-8, поэтому обычно важно именно количество байтов UTF-8. Некоторые более старые системы (например, внутренняя обработка строк в Windows/Java) используют UTF-16.
Правильно ли считаются эмодзи?
Да. Многие эмодзи внутренне хранятся как пара «суррогатных» кодовых единиц UTF-16, которые наивные методы подсчёта считают за 2 символа. Этот инструмент правильно считает кодовые точки Unicode, поэтому эмодзи считается за 1 символ, что соответствует тому, сколько символов человек реально видит.
Это то же самое, что и инструмент подсчёта слов?
Нет — счётчик слов сосредоточен на количестве слов и предложений для письма. Этот инструмент конкретно посвящён размеру в байтах в сравнении с количеством символов, что важно для технических ограничений, а не для требований к количеству слов.
Загружается ли мой текст куда-либо?
Нет. Подсчёт выполняется локально в вашем браузере с использованием встроенного текстового кодировщика JavaScript; ничего не отправляется на сервер.
Сколько байтов занимают кириллические буквы?
В UTF-8 каждая кириллическая буква — а, б, в и так далее — занимает 2 байта против 1 байта у латинской буквы без диакритики. Это значит, что текст на русском языке легко занимает почти вдвое больше байтов, чем то же количество символов на английском.
Эмодзи-флаг 🇷🇺 считается за один символ?
Визуально да, но технически флаг вроде 🇷🇺 состоит из двух объединённых кодовых точек Unicode (специальных регионгальных букв), поэтому при подсчёте он может показываться как 2 символа, даже если на экране отображается как единый флаг — это стоит учитывать в полях со строгим лимитом.
Считает ли инструмент байты в старых кодировках, например Windows-1251?
Нет, инструмент считает байты только в UTF-8 и UTF-16. Более старые кодировки, используемые в некоторых legacy-системах, например Windows-1251 или KOI8-R, имеют другие правила подсчёта байтов на символ (обычно фиксированный 1 байт, но без поддержки всех символов). Если нужна совместимость с такой legacy-системой, потребуется отдельный расчёт под конкретную кодировку.
Переносы строк и пробелы тоже учитываются в подсчёте байтов?
Да. Обычный пробел или перенос строки (LF) считается за 1 байт в UTF-8. При вставке длинного текста накопившиеся пробелы и переносы строк могут быть незаметны на глаз, но всё равно добавляются к общему числу байтов — это стоит учитывать, если вы близки к лимиту.