Все статьи

Подсчёт символов и слов: почему это не всегда тривиально

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

Байты против символов: почему кириллица «тяжелее»

В кодировке UTF-8 один латинский символ занимает один байт, а кириллический — уже два. Текст на русском языке той же длины в символах, что и английский, весит в кодировке UTF-8 почти вдвое больше в байтах. Это заметно на ограничениях вроде размера поля в базе данных или лимита на длину SMS, где расчёт «по символам» и «по байтам» даёт разные цифры.

Дефис как разделитель слов — не всегда разделитель

Русский язык активно использует дефис не только между самостоятельными словами («интернет-магазин»), но и внутри одной словоформы: частицы «-то», «-либо», «-нибудь» и приставка «кое-» пишутся через дефис, но остаются частью одного слова. Наивный подсчёт слов по пробелам и дефисам как разделителям может искусственно завысить число слов там, где лингвистически это одно слово.

Буква «ё» и подсчёт уникальных символов

В повседневном наборе текста «ё» почти всегда заменяют на «е» — это старая типографская традиция, восходящая ещё к печатным изданиям, где «ё» экономили как более редкую литеру. Из-за этого статистика по частоте символов в реальных текстах систематически занижает долю «ё» по сравнению с тем, как слова звучат при чтении вслух.

Зачем это нужно

  • Проверить текст на соответствие ограничению символов (твит, SMS, поле формы).
  • Оценить приблизительное время чтения статьи по количеству слов.
  • Сравнить длину текста в символах и в байтах UTF-8 перед отправкой в API с ограничением по байтам.

Подсчёт слов в языках без пробелов

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

Попробовать инструмент