CodeKitHub
Текстовые инструменты

Счётчик байтов — количество символов против размера в байтах

Последнее обновление:

Введите или вставьте текст и смотрите в реальном времени, сколько в нём символов, и сколько байтов он на самом деле занимает в UTF-8 и UTF-16 — эти два числа расходятся, как только появляются не-ASCII символы (диакритика, CJK-текст, эмодзи).

0
Символы
0
Байты UTF-8
0
Байты UTF-16

Что это за инструмент?

Для обычного 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 и заметили, что текст на русском выглядит коротким, а число байтов почему-то большое.
  • Пытались зарегистрировать имя пользователя с эмодзи в зарубежной системе и получили предупреждение, что осталось меньше места, чем ожидалось — можно посмотреть, сколько байтов и кодовых единиц эмодзи реально занимает внутри.
  • Даже работая с клиентскими данными или строками внутренней корпоративной системы, текст обрабатывается только в браузере, так что можно проверить, ничего никуда не отправляя.

Как использовать

  1. Введите или вставьте текст в поле.
  2. Прочитайте количество символов, количество байтов UTF-8 и количество байтов UTF-16 под ним — они обновляются по мере набора.

Пример

Ввод

Hello, 世界! 🌍

Результат

12 символов, 19 байт UTF-8, 26 байт UTF-16

ASCII-часть («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. При вставке длинного текста накопившиеся пробелы и переносы строк могут быть незаметны на глаз, но всё равно добавляются к общему числу байтов — это стоит учитывать, если вы близки к лимиту.

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