Как правильно посчитать символы в тексте

В копирайтинге считают символы с пробелами и пунктуацией: это часть текста. Другой способ нужен только по отдельному требованию.

Как правильно посчитать символы в тексте

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

В статье вы узнаете:

Для копирайтинга символы считают с пробелами

Фраза «Привет, мир!» состоит из 12 символов: девяти букв, пробела, запятой и восклицательного знака. Без пробела останется 11, а если оставить только буквы, получится 9. Все три числа можно вычислить честно, но отвечают они на разные вопросы.

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

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

Практическое правило. Если в брифе написано «до 5000 символов» без уточнений, считайте все знаки с пробелами. Если лимит строгий, лучше отдельно подтвердить это правило у заказчика, а не пытаться выиграть объём удалением пробелов из статистики.

Даже фраза «с пробелами» требует пары уточнений

Главная договорённость понятна, но границы материала всё равно могут отличаться. В объём иногда входят только абзацы статьи, а иногда также заголовок, подписи к изображениям, сноски и текст ссылок. Счётчик не знает, что заказчик считает основной работой. Он измеряет всё, что в него вставили.

Перед началом полезно договориться о четырёх вещах:

  1. С пробелами или без. Для копирайтинга разумный вариант по умолчанию: с пробелами.
  2. Какие части входят в объём. Заголовок, лид, подписи, таблицы и список источников могут считаться отдельно.
  3. Что делать с переносами строк. В файле перевод строки хранится как специальный знак, но редакторская методика может не включать его в объём.
  4. Где проверять итог. Если текст отправляют через форму с собственным лимитом, решающим остаётся счётчик этой формы.

Двойные пробелы, табуляция и неразрывный пробел тоже существуют в цифровом тексте, хотя визуально их легко не заметить. Их лучше исправлять как опечатки до финального подсчёта, а не придумывать правило, по которому часть пробелов внезапно перестаёт быть символами.

В компьютере у слова «символ» есть несколько значений

Пока текст состоит из обычных русских букв, цифр и пунктуации, разные способы подсчёта часто дают одинаковый результат. Расхождение появляется на составных буквах, редких письменностях и эмодзи. Чтобы понять причину, достаточно различать четыре уровня.

Графемный кластер ближе всего к тому, что человек видит как один знак. Курсор обычно проходит такой элемент за один шаг. Это может быть одна буква, буква с отдельным знаком ударения или целая последовательность, которая отображается как один эмодзи. Стандарт Unicode описывает алгоритм границ расширенных графемных кластеров как приближение к воспринимаемым пользователем символам [Unicode Standard Annex #29].

Кодовая точка является номером элемента в таблице Unicode. У русской «А», запятой, невидимого соединителя и отдельного модификатора оттенка кожи есть свои номера. Один графемный кластер может включать несколько таких точек.

Кодовая единица является фрагментом, которым конкретная кодировка или язык программирования хранит строку. В JavaScript элементы строки являются 16-битными единицами UTF-16, а свойство length возвращает их количество [спецификация ECMAScript]. Большинство обычных кириллических букв занимают одну такую единицу, многие эмодзи начинаются уже с двух.

Байт измеряет объём данных, а не количество видимых знаков. В UTF-8 латинская буква обычно занимает один байт, кириллическая буква два, а отдельная кодовая точка эмодзи часто четыре. Составной эмодзи может занимать гораздо больше.

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

Эти единицы не спорят друг с другом. Они измеряют разные свойства одной строки. Графемы нужны для понятного человеку ограничения поля, кодовые точки для работы со знаками Unicode, кодовые единицы для операций внутри некоторых языков, байты для размера файла или сетевого сообщения.

Один видимый знак может дать 1, 2, 4 или 25

Посмотрим на несколько строк. Графемы посчитаны по правилам сегментации Unicode, кодовые точки по элементам Unicode, кодовые единицы по UTF-16, байты по UTF-8.

Четыре способа измерить одну строку
ПримерВидимых знаковКодовых точекUTF-16Байтов UTF-8
Привет, мир!12121221
ё одним знаком1112
е + отдельные две точки1224
👍🏽1248
👨‍👩‍👧‍👦171125

Буква «ё» может храниться как готовая кодовая точка U+0451 или как «е» U+0435 вместе с отдельным знаком двух точек U+0308. На экране и для читателя это одна буква. Без нормализации простой технический счётчик увидит в первом варианте одну часть, а во втором две.

Эмодзи 👍🏽 состоит из базового жеста и модификатора тона кожи. Семейный эмодзи 👨‍👩‍👧‍👦 собран из четырёх людей и трёх невидимых соединителей. Он выглядит как одна картинка, но свойство length в JavaScript возвращает 11. В UTF-8 та же последовательность занимает 25 байтов.

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

Почему два счётчика показывают разные числа

Простейший веб-счётчик берёт длину строки в JavaScript. Именно так работает калькулятор количества символов eCalc: основной результат включает пробелы, а дополнительный удаляет пробельные знаки и считает оставшуюся строку. Для обычного русского текста это понятный и быстрый способ. Составные буквы и эмодзи он считает по единицам UTF-16, поэтому результат может быть больше числа видимых знаков.

Другой редактор может предварительно привести буквы к единой форме, пройти строку по кодовым точкам или разбить её на графемные кластеры. Платформа с жёстким лимитом может учитывать ссылки, переносы строк и служебные вставки по собственным правилам. Название результата одинаковое, алгоритмы разные.

Слова ещё труднее отделять механически: дефисы, инициалы, числа, адреса и языки без пробелов требуют дополнительных правил. Для практической оценки можно воспользоваться счётчиком слов, но в строгом задании методику тоже стоит уточнить. Если важен объём файла или сообщения, задача уже относится не к видимым символам, а к данным: их можно перевести в байты и более крупные единицы в конвертере битов и байтов.

Как получить правильное число для своей задачи

  1. Назовите цель. Для оплаты текста нужен редакторский объём, для поля интерфейса пользовательские знаки, для файла байты.
  2. Для копирайтинга выберите символы с пробелами. Не исключайте пунктуацию: она является частью законченного текста.
  3. Зафиксируйте границы. Решите, входят ли заголовки, подписи, таблицы, ссылки и сноски.
  4. Очистите случайный мусор. Исправьте двойные пробелы и лишние переводы строк, но не удаляйте нормальные пробелы ради меньшего числа.
  5. Проверяйте одним способом. При строгом лимите используйте тот же счётчик или форму, по которой результат будет принимать заказчик.
  6. Для программного ограничения укажите единицу. «До 100 графемных кластеров» или «до 400 байтов UTF-8» намного точнее, чем «до 100 символов».

Правильный подсчёт начинается не с кнопки, а с договорённости

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

В технической задаче сначала нужно выбрать единицу. Видимый знак, кодовая точка, единица UTF-16 и байт отвечают на разные вопросы. Когда единица и границы текста названы заранее, счётчики перестают противоречить друг другу: каждый просто сообщает своё число.

Есть что добавить?

Напишите своё мнение, комментарий или предложение.