Лимиты символов и слов 2026 — гид по Twitter, SMS, SEO, Instagram
Лимит символов — это максимальное число кодовых точек Unicode, которое платформа принимает в одном поле: 280 для поста в Twitter, 160 для односегментного SMS в кодировке GSM-7, около 160 для meta description в Google до обрезки. Какая цифра важна именно вам, зависит от площадки публикации и от того, есть ли в тексте эмодзи, типографские кавычки или иероглифы CJK — каждый из этих факторов меняет математику подсчёта.
Гид адресован SMM-копирайтерам, SEO-специалистам, маркетологам, отправителям SMS-рассылок с оплатой за сегмент и разработчикам, которые пишут валидацию под фактический подсчёт Twitter, Instagram или SMS-шлюзов. Перейдите к сводной таблице за шпаргалкой по 25+ площадкам или прогоните черновик через Счётчик слов, где прогресс-бары шести крупнейших платформ краснеют, как только текст перешагивает лимит.
Быстрая сводка — лимиты символов и слов по каждой площадке
Таблица ниже покрывает 30+ полей, с которыми авторам и разработчикам приходится сталкиваться чаще всего. «Жёсткий лимит» — это потолок, который соблюдает сама платформа; «Видимая часть / над сгибом» — то, что видит читатель до точки обрезки; «Sweet spot» — эмпирический диапазон, где контент работает лучше всего.
| Площадка | Жёсткий лимит | Видимая часть / над сгибом | Sweet spot | Эмодзи считается как |
|---|---|---|---|---|
| Twitter / X пост | 280 знаков | 280 | 70–100 знаков | 1 codepoint |
| Twitter / X био | 160 знаков | 160 | — | 1 codepoint |
| Twitter / X имя профиля | 50 знаков | 50 | — | 1 codepoint |
| X Premium long-form | 25 000 знаков | — | — | 1 codepoint |
| Instagram caption | 2 200 знаков | первые 125 (затем «ещё») | <125 для крючка | 1 codepoint |
| Instagram био | 150 знаков | 150 | — | 1 codepoint |
| Instagram хештеги | максимум 30 | — | 5–10 | — |
| LinkedIn пост | 3 000 знаков | первые 210 (затем «see more») | <1 300 | 1 codepoint |
| LinkedIn статья | 110 000 знаков | — | — | 1 codepoint |
| LinkedIn headline | 220 знаков | 220 | — | 1 codepoint |
| Facebook пост | 63 206 знаков | ~477 на десктопе / ~125 на мобильном | <80 для органики | 1 codepoint |
| TikTok caption | 2 200 знаков | первые ~100 | <150 | 1 codepoint |
| YouTube заголовок | 100 знаков | 70 (в поиске) | <60 | 1 codepoint |
| YouTube описание | 5 000 знаков | первые 100–150 над сгибом | первые 150 для крючка | 1 codepoint |
| YouTube комментарий | 10 000 знаков | — | — | 1 codepoint |
| Reddit заголовок | 300 знаков | — | <60 (зависит от сабреддита) | 1 codepoint |
| Reddit комментарий | 10 000 знаков | — | — | 1 codepoint |
| Discord сообщение | 2 000 знаков | 2 000 | — | 1 codepoint |
| Discord embed описание | 4 096 знаков | — | — | 1 codepoint |
| Slack сообщение | 40 000 знаков | — | <2 000 для читабельности | 1 codepoint |
| Pinterest описание пина | 500 знаков | первые 50–60 | <125 | 1 codepoint |
| Mastodon toot | 500 знаков (настраивается) | 500 | — | 1 codepoint |
| Bluesky пост | 300 знаков | 300 | — | 1 grapheme cluster |
| Threads пост | 500 знаков | 500 | — | 1 codepoint |
| SEO meta description (Google) | ~160 знаков на десктопе / ~120 на мобильном | 150–160 | 150–160 | 1 codepoint |
| SEO заголовок страницы (Google) | ~60 знаков на десктопе / ~50 на мобильном | 50–60 | 50–60 | 1 codepoint |
| Open Graph описание | ~200 знаков до обрезки в LinkedIn/FB | 150–200 | 150–200 | 1 codepoint |
| Twitter Card описание | 200 знаков максимум | 200 | 150–200 | 1 codepoint |
| SMS односегментное (GSM-7) | 160 знаков | — | — | особый случай — см. ниже |
| SMS односегментное (UCS-2 / эмодзи) | 70 знаков | — | — | 1 codepoint |
| WhatsApp текст сообщения | 65 536 знаков | — | — | 1 codepoint |
| Тема email | без жёсткого лимита платформы | ~60 на десктопе / ~30 на мобильном | <50 | 1 codepoint |
| Google Ads заголовок | 30 знаков × 15 заголовков | по 30 | 30 | 1 codepoint |
| Google Ads описание | 90 знаков × 4 описания | по 90 | 90 | 1 codepoint |
| App Store название | 30 знаков | 30 | 30 | 1 codepoint |
| App Store subtitle | 30 знаков | 30 | 30 | 1 codepoint |
| App Store описание | 4 000 знаков | первые 252 над сгибом | 252 для крючка | 1 codepoint |
| Play Store короткое описание | 80 знаков | 80 | 80 | 1 codepoint |
| Play Store полное описание | 4 000 знаков | первые 80 над сгибом | 80 для крючка | 1 codepoint |
Контент сверх отметки «sweet spot», как правило, обрезается, понижается в ранжировании или скрывается за пределами видимой карточки. X Premium long-form и Mastodon (настраивается на уровне инстанса) — редкие исключения, позволяющие писать дольше 500 знаков без штрафа. Каждый подсчёт выше — кроме случаев, где действуют правила SMS, — это подсчёт по кодовым точкам Unicode: один эмодзи стоит 1 знак, а не 2. Чтобы проверить черновик сразу против шести наиболее распространённых лимитов, вставьте его в Счётчик слов; прогресс-бары ловят превышение до того, как вы нажмёте «Опубликовать».
Как символы считаются на самом деле (codepoint Unicode против UTF-16)
Три разных инструмента могут выдать три разных значения длины одной и той же строки. Причина в том, что «символ» — понятие неоднозначное: это может быть кодовая точка Unicode, кодовая единица UTF-16 или кластер графем, и каждая платформа выбирает что-то своё.
Что такое «символ» — codepoint, code unit или grapheme
Кодовая точка (codepoint) — это скалярная величина Unicode: любое целое число от U+0000 до U+10FFFF, которое Unicode присвоил символу либо зарезервировал. Кодовая единица (code unit) — это наименьший фрагмент конкретной кодировки; UTF-16 использует 16-битные code unit, UTF-8 — 8-битные. Кластер графем (grapheme cluster) — это то, что человек воспринимает как один видимый символ: иногда это один codepoint, иногда базовый codepoint плюс комбинирующие знаки, иногда последовательность с zero-width joiner вроде семейного эмодзи 👨👩👧👦 (семь codepoint, объединённых в один видимый глиф).
Для строки "a🌍👨👩👧" три подсчёта расходятся:
| Метод подсчёта | Результат | Где используется |
|---|---|---|
UTF-16 code units (JS string.length) | 10 | Наивный код на JavaScript |
| Кодовые точки Unicode | 6 | Twitter, Instagram, SMS-шлюзы |
| Кластеры графем | 3 | Bluesky, программы экранного доступа, редакторы текста |
Почему string.length врёт об эмодзи
JavaScript хранит строки внутри в UTF-16. Любой codepoint выше U+FFFF (все эмодзи, все символы астральных плоскостей) кодируется суррогатной парой (surrogate pair) — двумя 16-битными code unit. Свойство .length возвращает эти две единицы, а не один символ.
"🌍".length // 2 (UTF-16 code units)
[..."🌍"].length // 1 (codepoints — what Twitter/SMS counts)
"🌍".match(/./gu).length // 1 (codepoints via regex with /u flag)
Spread-оператор и флаг regex /u оба итерируют по codepoint, что совпадает с тем, как Twitter, Instagram и SMS-шлюзы измеряют текст относительно своих лимитов. Функция валидации, опирающаяся на сырое .length, либо отклонит твиты, которые на самом деле помещаются в лимит, либо — что хуже — пропустит сообщения длиной 285 codepoint, которые отвергнет уже сервер.
А что с CJK и комбинирующими знаками
Китайские, японские и корейские иероглифы — это по одному codepoint каждый, и на всех платформах они считаются как один символ. Где они становятся дорогими — так это в SMS: любой символ вне GSM-7 переводит всё сообщение в кодировку UCS-2 и снижает лимит сегмента со 160 до 70 (об этом — в следующем разделе).
Комбинирующие знаки ведут себя иначе. Буква á, записанная как готовый á, — это один codepoint; та же á, записанная как a + ́ (комбинирующий акут), — два codepoint, но один кластер графем. Большинство платформ считают по codepoint, поэтому второй вариант стоит на один знак дороже. Bluesky — заметное исключение: он считает по кластерам графем, поэтому обе формы стоят 1.
Подсчёт в разных языках — краткая шпаргалка
// JavaScript
[...str].length // codepoints
Array.from(str).length // codepoints
// Python 3 — len() is codepoint by default
len(s)
// Go — utf8 package
utf8.RuneCountInString(s)
// Rust — chars() iterates codepoints
s.chars().count()
// Java — codePointCount
s.codePointCount(0, s.length())
Для сравнения: кодировщик Base64 напоминает про обратное направление — когда текст кодируется в Base64 для передачи, каждые 3 байта UTF-8 на входе превращаются в 4 ASCII-символа на выходе, и длина результата зависит от числа байт, а не от числа codepoint. Вставьте один эмодзи и посмотрите, как вывод Base64 разрастается до 8 символов — тот же эмодзи, который стоит 1 знак в Twitter, занимает 4 байта в UTF-8.
Чтобы увидеть подсчёт по codepoint (то самое число, которое реально мерит Twitter) в любом черновике, используйте Счётчик слов — он корректен относительно Unicode по умолчанию.
SMS-лимит символов — GSM-7, UCS-2 и многосегментные сообщения
SMS — единственный массовый канал, где добавление одного эмодзи может буквально удвоить счёт. Причина — в кодировке, и математика здесь не менялась с 1985 года.
Магическое число 160 — история GSM-7
Стандарт GSM 03.38 от 1985 года зафиксировал полезную нагрузку одного SMS на уровне 140 байт. При 7-битном кодировании 140 байт вмещают 1 120 бит ÷ 7 = 160 символов. Отсюда и знаменитый sms лимит символов 160. Набор GSM-7 покрывает 128 базовых символов плюс 10-символьное расширение ({ } [ ] | \ ~ ^ € и form feed). Внутри этого набора у вас есть полный бюджет в 160 знаков на сегмент.
Символы, выпадающие из GSM-7 и переключающие кодировку:
- Все эмодзи
- Типографские «фигурные» кавычки (
«»„"""'') — они отличаются от прямых ASCII-кавычек"' - Большинство латинских букв с акцентами помимо 35, входящих в GSM-7 (
é á ñ ü øи т. п.; GSM-7 включает лишьä ö å æ ø à è ì ò ùи ещё несколько) - Знаки препинания полной ширины, иероглифы CJK, арабский, иврит, греческие строчные буквы, кириллица
- Обратный апостроф
`и тильда~(тильда есть в таблице расширений GSM-7, поэтому она стоит 2 знака из 160)
Ловушка UCS-2 — один эмодзи роняет лимит со 160 до 70
В тот момент, когда в сообщении появляется хотя бы один символ вне GSM-7, всё сообщение переключается на кодировку UCS-2. UCS-2 использует 16 бит на символ, поэтому 140 байт ÷ 2 = 70 символов на сегмент. Реальные примеры:
"Hello, your code is 12345" → 26 chars, GSM-7, 1 segment
"Hello, your code is 12345 ✓" → 28 chars, GSM-7 (✓ in extension), 1 segment
"Hello, your code is 12345 ✅" → 28 chars, UCS-2 (emoji), 1 segment (under 70)
"Hello, "your" code is 12345 ✅" → smart quotes + emoji → UCS-2
"Hi 你好" → CJK → UCS-2, 1 segment (5 chars)
Последний пример "Hi 你好" — это и есть подвох: всего 5 символов, но тарификация уже по UCS-2, и следующие 65 знаков укладываются в один сегмент, после чего начинается сегмент 2.
Многосегментные SMS (конкатенация)
Как только текст превышает 160 (GSM-7) или 70 (UCS-2), сообщение делится на несколько сегментов. Каждый сегмент несёт 7-байтовый User Data Header (UDH) для сборки на стороне получателя, поэтому полезная нагрузка на сегмент уменьшается:
- GSM-7 multi-part: 153 символа на сегмент
- UCS-2 multi-part: 67 символов на сегмент
Принимающий телефон собирает сегменты прозрачно для получателя — но тарифицируют посегментно, а не за сообщение. Сообщение из 161 символа в GSM-7 стоит 2 сегмента. Сообщение из 1 000 символов в GSM-7 — 7 сегментов (153 × 6 = 918, седьмой сегмент несёт оставшиеся 82).
Математика стоимости — когда один эмодзи удваивает счёт
Возьмём маркетинговое сообщение из 80 символов обычного текста:
- Обычный текст: 80 знаков → GSM-7 → 1 сегмент по цене X
- Добавляем один эмодзи: 80 знаков → UCS-2 → 80 > 70 → 2 сегмента по цене 2X
Один эмодзи реально удваивает счёт, и на масштабе кампании это видно по счёту. Кампания на 100 000 сообщений по $0,0075 за сегмент обойдётся в $750 на GSM-7 против $1 500 на UCS-2 — эмодзи за $750. Все крупные SMS-провайдеры (Twilio, Bandwidth, AWS SNS, MessageBird, Vonage) тарифицируют именно так. Правила кодировки — это стандарт GSM, а не политика конкретного вендора. Подробная история компромиссов в кодировках на уровне байт — и почему ASCII / UTF-8 / UCS-2 вообще существуют как отдельные стандарты — разобрана в Understanding Base64: это та же семья задач «биты в символы», только применительно к email, а не к SMS.
Как удержать сообщения в GSM-7
- Используйте прямые ASCII-кавычки
"', а не типографские - Используйте ASCII-дефис
-, а не длинное—или короткое–тире - Записывайте
(c)и(R), а не©и® - Избегайте эмодзи, если бюджет кампании не закладывает стоимость UCS-2
- Консоли провайдеров (Twilio, Bandwidth, MessageBird) показывают «encoding: GSM-7» или «UCS-2» рядом с превью — проверьте перед рассылкой
Самая быстрая проверка во время черновика — прогресс-бар SMS в Счётчике слов; он отсчитывает относительно базовых 160 знаков. Если текст переключает кодировку на UCS-2, мысленно поделите число символов на 2,29, чтобы прикинуть количество сегментов по правилу 70.
SEO-лимиты — meta description, title tag, OG, Twitter Card
SEO-лимиты по символам мягче, чем платформенные: Google не отклонит страницу за meta description в 300 знаков, — но практические правила обрезки важны для click-through rate. Вот цифры, которые работают в 2026 году.
Meta description — sweet spot 150–160 знаков
Десктопная выдача Google обрезает meta description в районе 155–165 знаков; мобильная — где-то между 100 и 120. Точка обрезки плавает потому, что Google меряет пиксели отображения, а не символы. Описание из сплошных W и M упирается в порог обрезки раньше, чем описание из i и l.
Практические правила:
- Целевая длина — 150–160 символов
- Ключевой посыл — в первые 120 знаков (mobile-safe)
- Откройте описание ключом для meta description character limit этой страницы в первых 30 знаках
- Завершите CTA в последних 30 знаках — он останется читаемым, даже если десктоп срежет середину
В 2017–2018 годах Google ненадолго расширял отображение meta description до 320 символов, и целое поколение SEO-туториалов до сих пор ссылается на эту цифру. В середине 2018 года Google вернулся к 160. Сегодня писать дольше 200 знаков — значит прятать вторую половину.
Есть и обратный сбой: описания короче 120 знаков нередко заменяются целиком. Google решает, что ваше описание не полностью отвечает запросу, и подтягивает другой фрагмент из тела страницы — контроль над CTR теряется без предупреждения.
Title tag — 60 на десктопе, 50 на мобильном
Title-теги обрезаются в районе 60 символов на десктопе и 50 на мобильном. Обрезка та же — по пикселям, и оговорка про широкие глифы тоже та же.
Sweet spot: 50–60 символов, целевой ключ — в первых 30, чтобы пережить любую обрезку. Длинные брендовые суффиксы (| Brand Name) ставьте в конец, где обрезка наименее болезненна.
Ширина в пикселях против числа символов — реальное правило Google
Контейнер описания в SERP Google имеет ширину около 920 пикселей на десктопе. Средняя ширина символа — порядка 6,5 пикселя, что и даёт эмпирический ориентир в 140–160 знаков. Но разброс на символ велик: i рендерится примерно в 3 пикселя, M — около 11. Описание капсом («BEST WIDGETS FOR WINTER WEDDINGS») обрежется существенно раньше, чем строчная версия.
Превью на симуляторах SERP с попиксельной точностью надёжнее, чем счётчики символов, когда речь о SEO-копирайтинге.
Описания OG и Twitter Card
og:description из протокола Open Graph — это то, что Facebook, LinkedIn, Slack и Discord подставляют под превью расшаренной ссылки. Потолки отображения зависят от платформы — большинство обрезает около 200 знаков, некоторые тянут до 300. twitter:description в Twitter Card жёстко ограничен 200 знаками в парсере Twitter.
Разумные значения по умолчанию:
- 150–200 знаков и для OG, и для Twitter Card
- Они могут совпадать с meta description, но OG допускает чуть больше — длина OG не влияет на ранжирование в поиске
- Валидируйте, что попадает в OG (особенно случайные подтяжки структурированных данных), используя паттерны из Security Best Practices, где недоверенные OG-метаданные — распространённый вектор фишинга
Что на самом деле значит «без лимита символов»
У тегов H1, тела страницы и URL slug нет принудительного SEO-лимита по символам, но мягкие ограничения всё равно работают:
- H1 длиннее 70 знаков ломает визуальную иерархию и читаемость по диагонали
- URL slug формально не ограничен; Google отображает в SERP около 90 символов, всё сверх — косметика
- В теле страницы нет потолка по длине, но Google ранжирует полезный контент выше «воды» — количество слов само по себе не является сигналом ранжирования
Счётчик слов отслеживает в реальном времени и meta description (160), и title tag (60) — прогресс-бары становятся янтарными и красными при приближении к пиксельному порогу обрезки.
Социальные платформы — Twitter/X, Instagram, LinkedIn, Facebook и не только
У каждой платформы свой потолок по числу знаков и своя «sweet spot» ниже жёсткого лимита — диапазон, где контент по факту работает.
Twitter / X — 280, Premium 25 000, правило замены URL
Стандартный twitter лимит символов — 280, увеличен со 140 в ноябре 2017 года. Подписчики X Premium могут публиковать длинный контент до 25 000 знаков с расширенным форматированием, но в органическом охвате по-прежнему доминирует пост на 280 знаков.
Неочевидное правило — замена URL. Twitter оборачивает каждую ссылку — независимо от длины — в 23-символьную короткую ссылку t.co в момент публикации. Стоимость в 23 символа фиксирована.
published_length = raw_length − URL_length + 23
Пример: черновик "Check this: https://example.com/very-long-path?id=12345" — это 53 «сырых» символа. URL занимает 38 знаков, его заменяют на 23-символьный t.co, и итоговая опубликованная длина — 53 − 38 + 23 = 38 символов. Минус 15 символов, о которых вы и не догадывались.
При вставке длинного URL в черновик URL декодер и кодировщик — быстрый способ убедиться, что именно считается URL (Twitter распознаёт URL по паттернам RFC 3986 — query-строки и фрагменты в том числе). Поддомены, схемы, порты, пути, запросы и фрагменты — всё поглощается заменой на 23 знака.
Другие поля Twitter: имя профиля — 50 знаков, био — 160 знаков, handle — 15. В Threads (аналог Twitter от Meta) используется лимит 500.
Instagram — 2 200 caption, 30 хештегов, крючок на 125 знаков
Caption в Instagram допускает 2 200 символов, но в ленте показываются только первые 125 знаков до того, как остальное сворачивается за тапом «… ещё». Больше половины читателей по этому «ещё» не нажимают. Значимый для вовлечения instagram caption limit — это 125, даже если жёсткий потолок — 2 200.
Лимит на 30 хештегов — жёсткий: попытка добавить 31-й хештег ломает публикацию. Диапазон 5–10 хештегов обычно даёт лучший результат; начиная с 11 буст по discovery сглаживается, и алгоритм начинает воспринимать пост как спам.
Другие поля: био — 150 знаков, отображаемое имя — 30, личное сообщение — 1 000.
LinkedIn — 3 000 в посте, sweet spot 1 300, сгиб «see more»
Лимит символов LinkedIn для поста — 3 000, но в ленте показываются только первые 210 до сгиба «see more». Посты в диапазоне 1 200–1 500 символов выигрывают по вовлечению в LinkedIn (несколько исследований Buffer и Hootsuite сходятся на пике около 1 300): они достаточно длинные, чтобы показать ценность, и достаточно короткие, чтобы не утомить скроллом.
LinkedIn Articles (долгая публикационная площадка) допускают 110 000 знаков — фактически без ограничений. Заголовки профиля — до 220, секция «about» — до 2 600.
Facebook — 63 206 знаков, sweet spot в 80 знаков для органики
Лимит в 63 206 символов на пост в Facebook — это в основном курьёз; на практике посты короче 80 знаков получают примерно на 30% больше органического вовлечения, чем длинные (HubSpot фиксирует это в своих отчётах из года в год). Над сгибом десктоп показывает около 477 знаков; мобильный обрезает около 125.
Максимум комментария — 8 000 символов. Реакции, репосты и переходы по ссылкам тяготеют к коротким постам — длинный текст уместен в линкуемой статье, а не в caption Facebook.
Более новые платформы — Bluesky, Mastodon, Threads, TikTok
- Bluesky ограничивает посты 300 знаками и представляет необычный случай: подсчёт идёт по кластерам графем, поэтому семейный эмодзи из семи codepoint 👨👩👧👦 стоит 1 знак, а не 7
- Mastodon по умолчанию — 500 символов на toot, но администраторы инстансов могут поднять лимит до 5 000 или вовсе снять — сверяйтесь с конкретным инстансом
- Threads использует twitter-подобный лимит в 500 знаков с подсчётом по codepoint
- TikTok допускает 2 200 символов в caption, при этом над сгибом виден примерно 100
Reddit, Discord, Slack — длинная форма и сообщества
- Reddit — заголовок 300 символов (модераторы сабреддитов часто принудительно держат <60 через AutoModerator); комментарии — 10 000
- Discord — стандартное сообщение 2 000 символов; описания embed — 4 096; Nitro поднимает лимит на обычные сообщения до 4 000
- Slack — сообщение 40 000 символов; свыше 2 000 читаемость резко падает, и многие получатели игнорируют длинные сообщения
Целевой объём слов по типам контента
Для соцсетей и SEO решают лимиты символов; для всего остального — лимиты слов: академические работы, тарификация переводов, контент-маркетинг, рукописи. В таблице ниже — целевой диапазон и оценка времени чтения (230 wpm, медиана мета-анализа Brysbaert 2019 по «тихому» чтению) для каждого распространённого типа контента.
| Тип контента | Целевой объём | Время чтения @ 230 wpm | Примечание |
|---|---|---|---|
| Tweet | 30–40 слов | 10 с | оптимизируйте по знакам, не по словам |
| LinkedIn пост (sweet spot) | 170–250 слов | 1 мин | над сгибом |
| Instagram caption (крючок) | 20–25 слов | <10 с | первые 125 знаков |
| Блог-пост — короткий | 500–700 слов | 2–3 мин | listicle, новость, hot take |
| Блог-пост — стандартный | 1 000–1 500 слов | 4–7 мин | туториал, развёрнутый гид |
| Блог-пост — длинный | 2 000–3 000 слов | 9–13 мин | исчерпывающий гид |
| SEO pillar-страница | 2 500–5 000 слов | 11–22 мин | topical authority |
| Школьное эссе | 500–1 500 слов | 2–7 мин | зависит от задания |
| Студенческое эссе | 1 500–3 000 слов | 7–13 мин | по заданию |
| NaNoWriMo дневная норма | 1 667 слов в день | — | 50K слов за 30 дней |
| Роман — короткий | 50 000–70 000 слов | — | YA, детектив |
| Роман — стандартный | 80 000–100 000 слов | — | взрослая художественная литература |
| Доклад на конференции (12 мин @ 130 wpm) | 1 500–1 600 слов | устно | сверяйтесь репетицией |
| Эпизод подкаста (30 мин @ 130 wpm) | 3 900 слов | устно | сценарная часть |
Время чтения — более удобная единица для контент-маркетинга: на ярлык «5 минут чтения» читатели реагируют надёжнее, чем на «1 150 слов». Количество слов остаётся валютой для тарификации (перевод — по числу исходных слов), соблюдения правил площадок (50K у NaNoWriMo, академический потолок в 2 000 слов) и условий контрактов. Счётчик слов показывает обе метрики в реальном времени по мере набора, а ещё время произнесения вслух при 130 wpm — для докладов и подкастов.
6 ошибок подсчёта, которые ломают реальные приложения
Это типовые сбои, которые встречаются в выложенном коде и в запущенных маркетинговых кампаниях. Для каждого — симптом, корневая причина и фикс.
Ошибка 1: использовать string.length для валидации лимита
Симптом: Пользователь вставляет твит с тремя эмодзи длиной фактически 270 codepoint. Ваша frontend-валидация показывает 276 и отказывается отправлять. Или — что хуже — код пропускает черновик в 285 codepoint, потому что бюджет эмодзи «сократился» в сумме, и Twitter отвергает его на сервере.
Корневая причина: String.prototype.length в JavaScript возвращает code unit UTF-16. Каждый эмодзи — это surrogate pair, две единицы. Каждый символ из астральных плоскостей (математические знаки, древние письменности) — то же самое.
Фикс: итерируйте по codepoint через spread-оператор или Array.from.
// ❌ wrong
function isUnderTwitterLimit(text) {
return text.length <= 280;
}
// ✅ correct
function isUnderTwitterLimit(text) {
return [...text].length <= 280;
}
Более глубокие паттерны итерации по codepoint на регэкспах (включая работу с кластерами графем) — в Regex шпаргалке, где разобраны флаги /u и /v и Unicode property escapes.
Ошибка 2: разбивать CJK-текст на пробелах для подсчёта слов
Симптом: Китайская статья в 500 иероглифов отчитывается как 1 слово. Калькуляция за перевод по такому подсчёту ошибается в 500 раз.
Корневая причина: В языках CJK нет пробелов между словами. text.split(/\s+/) возвращает один токен, содержащий всё эссе.
Фикс: считать каждый CJK-иероглиф за одно слово — это конвенция, которой следуют Microsoft Word, Google Docs и любой нативный текстовый процессор CJK.
function countWordsMixed(text) {
const cjk = (text.match(/[一-鿿-ヿ가-]/g) || []).length;
const latin = (text
.replace(/[一-鿿-ヿ가-]/g, ' ')
.match(/[A-Za-z0-9]+(?:['’-][A-Za-z0-9]+)*/g) || []).length;
return cjk + latin;
}
Диапазоны Unicode покрывают CJK Unified Ideographs (U+4E00 – U+9FFF), хирагану и катакану (U+3040 – U+30FF), Hangul Syllables (U+AC00 – U+D7AF) — четыре блока, которые Microsoft Word учитывает как иероглифы.
Ошибка 3: забыть про 23-символьную замену URL в Twitter
Симптом: Черновик показывает 320 знаков в счётчике, включая 80-символьный URL. Вы 10 минут режете текст и только потом понимаете, что Twitter принял бы исходник на 263 знаках.
Корневая причина: Twitter заменяет каждый URL на 23-символьный t.co в момент публикации. Сырому счётчику об этом неизвестно.
Фикс: заранее вычислите опубликованную длину по формуле raw − URL_length + 23 для каждой ссылки. В черновиках с несколькими URL сложите поправки. Распознавание URL в публикуемом контенте идёт по RFC 3986 — те же правила парсинга разобраны в гиде URL Encoding & Decoding.
Ошибка 4: писать meta description на 320 знаков (устаревший гайд)
Симптом: Вы написали meta description в 280 символов с CTA в конце. В поиске Google описание обрывается на полуфразе на 158-м знаке, и CTA читатель не видит.
Корневая причина: Между декабрём 2017 и маем 2018 Google ненадолго расширил отображение meta description до 320 знаков. Многие SEO-туториалы до сих пор приводят эту цифру. В середине 2018-го Google вернулся к ~160 и с тех пор оттуда не уходил.
Фикс: писать на 150–160 знаков. Первичный ключ — в первые 30 знаков, CTA — в последние 30. Для высокоставочных страниц используйте попиксельный симулятор SERP — широкие глифы (W, M, K) съедают бюджет быстрее узких (i, l, t).
Ошибка 5: путать 280 символов с 280 словами
Симптом: Кто-то в команде пишет «нужен твит на 280 слов» и выдаёт 1 500 знаков прекрасной прозы. Твит не публикуется.
Корневая причина: Путаница «знаки или слова». Эти единицы отличаются примерно в 5–6 раз для английской прозы.
Фикс: зафиксируйте правило по каждой платформе. Twitter, SMS и SEO meta считают символы. NaNoWriMo, академические задания, контракты на перевод и большинство контент-маркетинговых брифов считают слова. Если сомневаетесь, сверьтесь со счётчиком самой платформы (поле создания твита в Twitter, Word > Review > Word Count), прежде чем фиксировать ТЗ.
Ошибка 6: вставить типографские кавычки и молча переключить SMS на UCS-2
Симптом: Вы копируете шаблон чека из Google Doc в SMS-отправитель. Оригинал — 145 знаков, уходил одним сегментом GSM-7. После вставки — те же 145 знаков, но тарифицируется как 2 сегмента UCS-2. На кампании в миллион сообщений счёт удваивается.
Корневая причина: Google Docs и Word автоматически заменяют " и ' на типографские «кавычки» " " и ' '. Эти кавычки не входят в GSM-7, что переключает всё сообщение на UCS-2.
Фикс: нормализуйте перед отправкой.
function toGsm7Quotes(s) {
return s
.replace(/[“”]/g, '"') // " " → "
.replace(/[‘’]/g, "'") // ' ' → '
.replace(/[–—]/g, '-'); // – — → -
}
Прогоняйте эту функцию перед billing-sensitive отправками. Twilio, MessageBird и Bandwidth — все возвращают поле encoding в ответе; логируйте его и поднимайте алерт, когда UCS-2 появляется в шаблонах, которые планировались как GSM-7.
FAQ
Чем отличается подсчёт символов от подсчёта слов?
Подсчёт символов считает каждый знак, включая пробелы, пунктуацию и эмодзи, и на большинстве современных платформ — по codepoint Unicode. Подсчёт слов считает токены, разделённые пробелами, для латинских письменностей и по одному иероглифу — для CJK. Twitter, SMS и SEO meta description работают по числу знаков. Академические эссе, рукописи NaNoWriMo и счета на перевод — по числу слов.
Почему Twitter считает эмодзи как 1 символ, а JavaScript — как 2?
Twitter меряет по codepoint Unicode — каждый эмодзи — это один codepoint, один знак. string.length в JavaScript меряет code unit UTF-16. Большинство эмодзи находятся выше U+FFFF и кодируются суррогатной парой в UTF-16, поэтому занимают две code unit, а .length возвращает 2. Используйте [...text].length или Array.from(text).length, чтобы получить то самое число codepoint, которое реально считает Twitter.
Почему SMS-лимит то 160, то 70?
SMS по умолчанию использует 7-битную кодировку GSM-7, дающую 160 символов в 140 байтах. Если в сообщении есть хотя бы один символ вне GSM-7 — эмодзи, типографские кавычки, CJK, латиница с акцентами вне небольшого набора, — всё сообщение переключается на 16-битную UCS-2, и лимит на сегмент падает до 70. Достаточно одного эмодзи в любом месте, чтобы сработало переключение.
Какая идеальная длина meta description в 2026 году?
Цельтесь в 150–160 знаков. Десктопная SERP Google обрезает в районе 155–165 в зависимости от пиксельной ширины глифов; мобильная — между 100 и 120. При длине меньше 120 знаков Google нередко заменяет ваше описание фрагментом из тела страницы. Поставьте первичный ключ в первые 30 знаков и CTA — в последние 30, чтобы посыл пережил обрезку в любую сторону.
Включает ли лимит символов пробелы и эмодзи?
Да, практически на каждой платформе. Пробелы, переносы строк, знаки препинания и эмодзи считаются по одному codepoint Unicode каждый. Два исключения, о которых стоит знать: SMS, где эмодзи запускает переключение кодировки, описанное выше, и Bluesky, который считает кластеры графем, поэтому многокодпоинтный эмодзи вроде семьи 👨👩👧👦 стоит 1 символ, а не 7.
Как считается число слов для китайского, японского и корейского?
Каждый иероглиф CJK считается за одно слово — этой конвенции следуют китайский режим Microsoft Word, Google Docs, нативные редакторы CJK и все коммерческие системы памяти переводов. Эссе на 500 китайских иероглифов отчитывается как 500 слов. Смешанный текст считает CJK-иероглифы посимвольно, латинские токены — по пробелам, и складывает обе суммы.
Как Twitter обрабатывает длину URL в рамках лимита 280?
Twitter автоматически оборачивает каждый URL в 23-символьную короткую ссылку t.co в момент публикации, независимо от исходной длины. Опубликованная длина вычисляется по формуле published = raw − URL_length + 23 для каждой ссылки. Черновик в 320 знаков с одним 100-символьным URL уйдёт как 243 знака. Twitter распознаёт URL по паттернам RFC 3986, поэтому query-строки и фрагменты входят в токен ссылки.
Связанное чтение
- Regex шпаргалка — сопоставление шаблонов для валидации символов, Unicode property escapes
- Гид по онлайн-сравнению текста — сравнение двух фрагментов текста построчно и посимвольно
- Гид по кодированию и декодированию URL — правила экранирования при передаче текста через URL
- Understanding Base64 — вторая половина задачи «биты в символы», применённая к email и бинарным данным