Перейти к содержимому

Посчитать символы

С пробелами и без, плюс число байт, которое на самом деле измеряют ваша база данных и SMS-шлюз. Эмодзи здесь считается одним символом, потому что так оно и есть.

  • Не сохраняется
  • Без очереди и ожидания
  • Без регистрации и водяных знаков

0

Символы

то, что видит человек

0

Без пробелов

без пробельных символов

0

Слова

на любом языке

0

Байты UTF-8

то, что считает база данных

Все показатели и где они нужны
СтрокиКак их нумерует редактор
0
ПредложенияНе разрываются на «т. е.» или «и т. д.»
0
АбзацыБлоки, разделённые пустой строкой
0
Кодовые точкиТо, чему соответствует «.» в регулярном выражении
0
Единицы UTF-16То, что возвращает string.length в JavaScript
0
Байты UTF-8То, что измеряют лимит VARCHAR и HTTP-заголовки
0
Время чтенияПро себя, 238 слов в минуту
—
Время произнесенияВслух, 150 слов в минуту
—
Самое длинное словоВ символах, а не в байтах
—
Средняя длина словаГрубый показатель читаемости
—

Начните вводить — и всё заполнится. Попробуйте эмодзи или предложение на китайском: оба посчитаются так, как посчитал бы человек, а большинство счётчиков тут ошибается.

Как это работает

1

Вставьте или наберите текст

Подсчёт обновляется по ходу. Ничего не сохраняется.

2

Выберите нужный подсчёт

Символы, символы без пробелов, кодовые точки или байты UTF-8 — показано всё, с пояснением, где что используется.

3

Следите за лимитом

SEO-заголовки, метаописания, сегменты SMS и поле на 255 байт — всё сверяется с тем, что вы написали.

Четыре числа, потому что у слова «символ» четыре значения

Возьмите эмодзи семьи или поднятый большой палец с оттенком кожи. Человек видит один символ. Он собран из нескольких кодовых точек, соединённых невидимыми связками, поэтому регулярное выражение видит семь. JavaScript хранит текст в 16-битных единицах, и всё, что выходит за базовый диапазон, занимает две из них, поэтому он сообщает одиннадцать. В кодировке UTF-8 для столбца базы данных это двадцать пять байт. Ни одно из этих чисел не ошибочно, и ни одно не является ответом — правильное целиком зависит от того, что устанавливает ограничение.

Поэтому практический вопрос — кто ввёл лимит. Столбец базы данных, объявленный как VARCHAR, в большинстве СУБД считает байты — поэтому поле, принимающее 255 английских символов, отвергает гораздо меньше японских. SMS — это 160 символов в собственном семибитном алфавите, и лимит падает до 70 на сообщение, как только хотя бы один символ выходит за его пределы, — одна фигурная кавычка или эмодзи может превратить одно сообщение в три. Валидатор формы на JavaScript почти всегда считает единицы UTF-16 — поэтому поле с лимитом в 280 символов может отвергнуть строку с эмодзи, которая выглядит короче.

Подсчёт того, что видит читатель, — самый сложный, и выполняется он собственной сегментацией текста в браузере — тем же механизмом, который решает, куда переместится курсор при нажатии стрелки влево. Это правильное определение «одного символа» для всего, что воспринимает человек, и оно справляется со случаями, на которых спотыкается более простой подсчёт: буква с диакритикой, записанная как базовая буква плюс комбинируемый знак, — это один символ, а кластеры хинди и тайского считаются так, как их воспринимает читатель этих письменностей.

Для обычного английского текста все четыре числа совпадают — поэтому проблема остаётся незаметной, пока не проявится. Они расходятся на эмодзи, на символах с диакритикой и комбинируемых знаках, на нелатинских письменностях и на математических символах — а именно такие данные и приводят к тому, что поле в базе данных молча обрезается через три месяца после её создания.

Если нужно другое

В коде используйте функцию, которая считает то, что вам нужно, а не длину по умолчанию. Intl.Segmenter в JavaScript считает то, что видит читатель; строки Python 3 считают кодовые точки, а len(s.encode("utf-8")) — байты; в PHP есть mb_strlen и strlen именно для этого различия. По умолчанию в большинстве языков выбрано то, что было удобно самому языку, и это редко то, что имеет в виду ваш лимит.

Если ограничение задаёт поле базы данных, надёжное решение — выше по цепочке. Объявление столбца как utf8mb4 в MySQL или text в PostgreSQL устраняет целый класс ошибок усечения — старая кодировка utf8 в MySQL печально известна тем, что отводит на символ только три байта и вообще не может хранить эмодзи. Аккуратный подсчёт в форме — это обходной путь для столбца, который следовало объявить иначе.

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

Мой текст где-нибудь сохраняется?

Нет. Ничего не сохраняется, никакие запросы не отправляются, и инструмент продолжает работать даже без сети. Для текста это важнее, чем кажется: в онлайн-счётчики вставляют неопубликованные тексты, черновики юридических документов, студенческие работы и внутренние документы.

Почему подсчётов символов четыре?

Потому что у «символа» четыре разных значения, а большинство инструментов знает только одно. То, что ВЫ видите как один символ, — это графемный кластер: «é», «🎉» и даже «👨‍👩‍👧‍👦» — каждый по одному. string.length в JavaScript сообщает число кодовых единиц UTF-16, и там эмодзи семьи — это 11. Регулярное выражение сопоставляет кодовые точки, и там их 7. А столбец базы данных или HTTP-заголовок измеряет БАЙТЫ UTF-8, и там их 25. Здесь показаны все четыре, потому что нужное число зависит от того, кто устанавливает ограничение.

Сколько символов в эмодзи?

Здесь — один, потому что для читающего человека это один символ, и именно так считает лимит символов на современных платформах. В других местах это может быть 2, 7 или 11: «👨‍👩‍👧‍👦» — это четыре человека, соединённые тремя невидимыми символами-связками, то есть 7 кодовых точек и 11 единиц, которые считает string.length в JavaScript. Если форма отвергла ваш текст как слишком длинный, хотя он выглядел достаточно коротким, причина обычно в этом, а подсчёт байт на этой странице покажет реальный размер.

Почему мой текст из 200 символов не поместился в поле базы данных на 255 символов?

Потому что поле почти наверняка ограничивает БАЙТЫ, а не символы. В UTF-8 обычные английские буквы занимают по одному байту, буквы с диакритикой — по два, а китайские, японские, арабские символы и эмодзи — по три или четыре. Так что 200 символов японского текста — это 600 байт. Число байт показано здесь именно поэтому — это то число, которое на самом деле проверяет ваша база данных.

Почему один эмодзи сокращает лимит SMS со 160 до 70?

Потому что текстовое сообщение использует компактный 7-битный алфавит на 160 символов — а в нём нет эмодзи, нет фигурных кавычек и почти нет букв с диакритикой. Один символ вне этого алфавита переводит ВСЁ сообщение в Unicode, и лимит падает до 70. Фигурный апостроф, вставленный из Word, делает это так же легко, как эмодзи. Так короткое сообщение оплачивается как три, и страница сообщает об этом в тот же момент.

Считаются ли пробелы?

Показаны обе цифры сразу, так что выбирать не нужно. Переносы строк и табуляции тоже считаются пробельными символами.

Полезно знать: Четыре числа, потому что у слова «символ» четыре значения, и нужное зависит от того, кто устанавливает ограничение. VARCHAR в базе данных считает байты UTF-8, регулярное выражение — кодовые точки, JavaScript — единицы UTF-16, а человек — то, что видит. Сильнее всего они расходятся на эмодзи.

Разместите этот инструмент на своём сайте

Бесплатно для любого блога, страницы класса или справочной статьи. Вставьте один фрагмент кода — и посетители смогут пользоваться инструментом прямо на вашей странице.