БлогУслугиКарьера
Обсудить проект
БлогУслугиКарьераОбсудить проект
Разработка сайтов

Подсчёт символов: 5 причин, почему цифры не совпадают

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

Редакция Feature IT
Редакция Feature IT·
29 сен
·
8 мин
·
Подсчёт символов: лупа над буквами, эмодзи и пробелом, рядом три разных счётчика

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

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

1. Под словом «символ» скрываются разные единицы

Человек обычно считает видимые знаки. Программа может считать кодовые единицы UTF-16, кодовые точки Unicode или графемы — воспринимаемые пользователем знаки. Это три разные величины. Для простой кириллицы они часто совпадают, поэтому различие долго остаётся незаметным.

Возьмём букву Я. Во всех трёх режимах из таблицы она занимает одну позицию. Теперь возьмём 😀: видимый знак один, кодовая точка одна, а кодовых единиц UTF-16 две. Именно кодовые единицы возвращает свойство JavaScript String.length, как поясняет документация MDN.

Точная строка UTF-16 Кодовые точки Графемы
Я 1 1 1
😀 2 1 1
👍🏽 4 2 1
e + комбинируемое ударение U+0301 2 2 1

Значения относятся к указанным последовательностям. Внешне похожий знак может быть закодирован иначе. Например, готовая буква é и сочетание e с отдельным знаком ударения могут выглядеть одинаково, хотя исходные строки различаются.

Из этого следует практическое правило: в техническом задании недостаточно написать «не больше 200 символов». Укажите единицу, обработку пробелов и место окончательной проверки. Если ограничение принадлежит внешней площадке, ориентируйтесь на её документацию и проверяйте текст в самом поле публикации.

В счётчике символов Feature IT текущий показатель с пробелами вычисляется через JavaScript length. Поэтому он отражает кодовые единицы UTF-16. Это полезный инструмент для обычного текста, но его число нельзя автоматически принимать за количество видимых эмодзи или лимит любой социальной сети.

2. Эмодзи могут состоять из нескольких частей

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

Для редактора это означает, что удаление одного значка иногда освобождает сразу несколько позиций в техническом счётчике. Такой результат сам по себе не говорит об ошибке. Ошибкой будет обещание «считаем видимые символы», если программа фактически использует длину UTF-16.

Если задача именно в видимых знаках, в JavaScript можно использовать Intl.Segmenter с режимом grapheme. Это встроенный механизм сегментации текста; его назначение и варианты использования описаны в документации MDN. Для целевых браузеров поддержку проверяют отдельно.

const text = "👍🏽";
const segmenter = new Intl.Segmenter("ru", {
  granularity: "grapheme",
});

console.log(text.length); // 4 кодовые единицы UTF-16
console.log([...text].length); // 2 кодовые точки
console.log([...segmenter.segment(text)].length); // 1 графема

Этот пример сравнивает способы измерения. Он не определяет правила Telegram, VK или CMS. У внешнего сервиса могут быть собственные ограничения для сообщения, подписи и других полей. При публикации через API также учитывают конкретный метод и обработку форматирования.

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

3. «Без пробелов» не всегда означает одно и то же

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

Рассмотрим строку из трёх элементов: А, перевод строки, Б. В JavaScript её можно записать как "А\nБ". Длина составляет три кодовые единицы. Если удалить только обычные пробелы, останется три. Если удалить все символы, попадающие под регулярное выражение \s, останется два.

const text = "А\nБ";

console.log(text.length); // 3
console.log(text.replace(/ /g, "").length); // 3
console.log(text.replace(/\s/g, "").length); // 2

В текущем счётчике Feature IT показатель «без пробелов» использует replace(/\s/g, ""). Он исключает не только обычный пробел, но и другие пробельные символы из этого класса. При сдаче текста согласуйте это с редактором, особенно если материал содержит списки, таблицы и много коротких абзацев.

Договориться проще на маленьком примере. Составьте строку с обычным пробелом, переносом и табуляцией, затем сравните результат в выбранном инструменте. Запишите правило в задании: например, «считать исходную строку в UTF-16, исключая пробельные символы JavaScript \s». Для нетехнической команды можно закрепить один конкретный сервис и пример ожидаемого результата.

Если вас интересует только разница объёма при сдаче текста, отдельная статья объясняет подсчёт с пробелами и без них. Здесь важнее другое: совпадение названия показателя не заменяет совпадение его определения.

Проверьте исходный текст

Сравните длину с пробельными символами и без них в счётчике Feature IT.

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

4. Копирование приносит невидимые знаки и разные переносы

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

Обычный пробел U+0020 и неразрывный пробел U+00A0 выглядят похоже. Второй удерживает соседние части текста на одной строке. Например, редактор может поставить его между числом и единицей измерения. Заменять все такие пробелы без проверки не стоит: можно ухудшить типографику готовой страницы.

Ещё один источник расхождений — окончания строк. Последовательность CRLF содержит два кодовых символа, LF — один. Файлы и инструменты могут преобразовывать их при чтении или вставке. Поэтому подсчёт в исходном файле и в браузерном поле иногда отличается на число переносов, даже если видимые абзацы одинаковы.

Для диагностики удобно вывести кодовые точки строки. Этот код показывает символ и его номер, не меняя исходный текст:

const text = "А\u00A0Б\n";
const rows = [...text].map((char) => ({
  symbol: JSON.stringify(char),
  codePoint: `U+${char.codePointAt(0).toString(16).toUpperCase().padStart(4, "0")}`,
}));
console.table(rows);

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

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

5. Сервис считает не тот слой текста, который вы видите

В публикации могут одновременно существовать исходный Markdown, HTML, текст после обработки и видимое представление. Их длины различаются. Например, Markdown-ссылка содержит подпись и адрес, а на экране читатель видит только подпись. HTML-теги занимают место в исходном коде, но не отображаются как текст.

Прежде чем проверять лимит, определите слой. Для пользовательского поля обычно важен ввод, для API — строка в конкретном параметре и правила её разбора, для редакционной задачи — согласованный вариант текста. Подсчёт длины HTML-файла не отвечает на вопрос, сколько знаков прочитает посетитель.

Отдельно стоят байты. Хранилище, сетевой протокол или сторонний сервис могут ограничивать размер в байтах. Кириллица, латиница и эмодзи имеют разный размер в UTF-8. Поэтому количество байтов нельзя подменять количеством букв или результатом String.length.

const text = "Я";
console.log(text.length); // 1 кодовая единица UTF-16
console.log(new TextEncoder().encode(text).length); // 2 байта UTF-8

Если речь о SEO-заголовке, символы тоже не равны гарантированной ширине в выдаче. У Google нет универсального ограничения длины элемента title в символах: отображение зависит от доступной ширины устройства. Сам заголовок результата может формироваться из нескольких источников. Это описано в рекомендациях Google по title.

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

Обсудим ваш проект?

Оставьте контакты — перезвоним и обсудим задачу

Как сверить текст без случайных исправлений

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

Затем сократите проблему до небольшого фрагмента. Уберите половину текста в диагностической копии и посмотрите, осталось ли расхождение. Повторяйте, пока не найдёте конкретную строку. Такой способ быстрее, чем по очереди удалять запятые из большого материала, и сохраняет причину ошибки для разработчика.

Дальше используйте последовательность:

  1. Сравните длину с пробелами и без них.
  2. Проверьте эмодзи и комбинируемые знаки.
  3. Сравните обработку переводов строк и табуляции.
  4. Найдите неразрывные и невидимые символы.
  5. Уточните, считается исходный текст, результат разметки или байты.
  6. Проверьте окончательный вариант в целевой форме или API.

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

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

Что проверить разработчику формы

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

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

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

Читайте также

  • 200 символов: сколько это слов и строк
  • Как посчитать символы для публикации в соцсетях
  • Сколько символов помещается в посте

Обсудим ваш проект?

Оставьте контакты — перезвоним и обсудим задачу

Содержание
  • 1. Под словом «символ» скрываются разные единицы
  • 2. Эмодзи могут состоять из нескольких частей
  • 3. «Без пробелов» не всегда означает одно и то же
  • 4. Копирование приносит невидимые знаки и разные переносы
  • 5. Сервис считает не тот слой текста, который вы видите
  • Как сверить текст без случайных исправлений
Поделиться:

Похожие статьи

Заказная разработка: 5 способов получать больше клиентов
Разработка сайтов

Заказная разработка: 5 способов получать больше клиентов

9 мин
В 2026 клиент не находит вас в Google — и уходит. Навсегда
Разработка сайтов

В 2026 клиент не находит вас в Google — и уходит. Навсегда

8 мин
За одну галочку на сайте штраф 18 миллионов рублей. Есть ли она у вас?
Разработка сайтов

За одну галочку на сайте штраф 18 миллионов рублей. Есть ли она у вас?

10 мин
Feature IT

Feature IT — платформа по обучению программированию и разработке цифровых продуктов. Мы создаём современные веб-решения для бизнеса и обучаем этому других!

Политика конфиденциальностиПользовательское соглашение

О компании

  • Блог
  • Карьера

Услуги разработки

  • Разработка сайтов под ключ
  • Веб-приложения на React/Next.js
  • Telegram-боты для бизнеса
  • Mini Apps (Telegram, VK)
  • SEO-оптимизированные сайты
  • Автоматизация бизнес-процессов
  • Поддержка и развитие IT-продуктов

Обучение

  • Курс Python с нуля
  • Алгоритмы и структуры данных
  • Паттерны проектирования
  • Подготовка к собеседованиям в IT
  • Практика на реальных проектах

Инструменты

  • Генератор UTM-меток
  • Счётчик символов