Посчитать символы
С пробелами и без, плюс число байт, которое на самом деле измеряют ваша база данных и SMS-шлюз. Эмодзи здесь считается одним символом, потому что так оно и есть.
- Не сохраняется
- Без очереди и ожидания
- Без регистрации и водяных знаков
0
Символы
то, что видит человек
0
Без пробелов
без пробельных символов
0
Слова
на любом языке
0
Байты UTF-8
то, что считает база данных
- СтрокиКак их нумерует редактор
- 0
- ПредложенияНе разрываются на «т. е.» или «и т. д.»
- 0
- АбзацыБлоки, разделённые пустой строкой
- 0
- Кодовые точкиТо, чему соответствует «.» в регулярном выражении
- 0
- Единицы UTF-16То, что возвращает string.length в JavaScript
- 0
- Байты UTF-8То, что измеряют лимит VARCHAR и HTTP-заголовки
- 0
- Время чтенияПро себя, 238 слов в минуту
- —
- Время произнесенияВслух, 150 слов в минуту
- —
- Самое длинное словоВ символах, а не в байтах
- —
- Средняя длина словаГрубый показатель читаемости
- —
Начните вводить — и всё заполнится. Попробуйте эмодзи или предложение на китайском: оба посчитаются так, как посчитал бы человек, а большинство счётчиков тут ошибается.
Как это работает
Вставьте или наберите текст
Подсчёт обновляется по ходу. Ничего не сохраняется.
Выберите нужный подсчёт
Символы, символы без пробелов, кодовые точки или байты UTF-8 — показано всё, с пояснением, где что используется.
Следите за лимитом
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, а человек — то, что видит. Сильнее всего они расходятся на эмодзи.
Разместите этот инструмент на своём сайте
Бесплатно для любого блога, страницы класса или справочной статьи. Вставьте один фрагмент кода — и посетители смогут пользоваться инструментом прямо на вашей странице.
Похожие инструменты
Счётчик слов
Слова, предложения и время чтения
Сравнить тексты
Что именно изменилось между двумя версиями
Изменить регистр текста
ВЕРХНИЙ, нижний, Как В Заголовке, camelCase и другие
Кодировать в Base64
Текст или файл в Base64
Удалить повторяющиеся строки
Уберите повторы, отсортируйте и приведите список в порядок
Минификатор HTML
Сожмите HTML, не сломав страницу