Подсчёт символов и слов кажется тривиальной задачей, но для русского текста тут есть свои ловушки: буква «ё» часто заменяется на «е» при наборе, а слова с частицами через дефис создают неоднозначность в определении «одного слова».
Байты против символов: почему кириллица «тяжелее»
В кодировке UTF-8 один латинский символ занимает один байт, а кириллический — уже два. Текст на русском языке той же длины в символах, что и английский, весит в кодировке UTF-8 почти вдвое больше в байтах. Это заметно на ограничениях вроде размера поля в базе данных или лимита на длину SMS, где расчёт «по символам» и «по байтам» даёт разные цифры.
Дефис как разделитель слов — не всегда разделитель
Русский язык активно использует дефис не только между самостоятельными словами («интернет-магазин»), но и внутри одной словоформы: частицы «-то», «-либо», «-нибудь» и приставка «кое-» пишутся через дефис, но остаются частью одного слова. Наивный подсчёт слов по пробелам и дефисам как разделителям может искусственно завысить число слов там, где лингвистически это одно слово.
Буква «ё» и подсчёт уникальных символов
В повседневном наборе текста «ё» почти всегда заменяют на «е» — это старая типографская традиция, восходящая ещё к печатным изданиям, где «ё» экономили как более редкую литеру. Из-за этого статистика по частоте символов в реальных текстах систематически занижает долю «ё» по сравнению с тем, как слова звучат при чтении вслух.
Зачем это нужно
- Проверить текст на соответствие ограничению символов (твит, SMS, поле формы).
- Оценить приблизительное время чтения статьи по количеству слов.
- Сравнить длину текста в символах и в байтах UTF-8 перед отправкой в API с ограничением по байтам.
Подсчёт слов в языках без пробелов
В китайском, японском или тайском языках слова традиционно не разделяются пробелами — границу между словами определяет грамматика и контекст, а не разделитель. Поэтому «подсчёт слов» для таких языков на самом деле требует отдельного алгоритма сегментации текста, а простой подсчёт по пробелам там даст либо одно «слово» на весь текст, либо вообще потеряет смысл.