Skip to content
Назад к блогу
Руководства

Лимиты символов и слов 2026 — гид по Twitter, SMS, SEO, Instagram

Гид 2026 по лимитам символов и слов — Twitter, SMS GSM-7/UCS-2, SEO meta, Instagram, LinkedIn — с математикой подсчёта Unicode и онлайн-счётчиком слов.

13 мин чтения

Лимиты символов и слов 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 знаков28070–100 знаков1 codepoint
Twitter / X био160 знаков1601 codepoint
Twitter / X имя профиля50 знаков501 codepoint
X Premium long-form25 000 знаков1 codepoint
Instagram caption2 200 знаковпервые 125 (затем «ещё»)<125 для крючка1 codepoint
Instagram био150 знаков1501 codepoint
Instagram хештегимаксимум 305–10
LinkedIn пост3 000 знаковпервые 210 (затем «see more»)<1 3001 codepoint
LinkedIn статья110 000 знаков1 codepoint
LinkedIn headline220 знаков2201 codepoint
Facebook пост63 206 знаков~477 на десктопе / ~125 на мобильном<80 для органики1 codepoint
TikTok caption2 200 знаковпервые ~100<1501 codepoint
YouTube заголовок100 знаков70 (в поиске)<601 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 0001 codepoint
Discord embed описание4 096 знаков1 codepoint
Slack сообщение40 000 знаков<2 000 для читабельности1 codepoint
Pinterest описание пина500 знаковпервые 50–60<1251 codepoint
Mastodon toot500 знаков (настраивается)5001 codepoint
Bluesky пост300 знаков3001 grapheme cluster
Threads пост500 знаков5001 codepoint
SEO meta description (Google)~160 знаков на десктопе / ~120 на мобильном150–160150–1601 codepoint
SEO заголовок страницы (Google)~60 знаков на десктопе / ~50 на мобильном50–6050–601 codepoint
Open Graph описание~200 знаков до обрезки в LinkedIn/FB150–200150–2001 codepoint
Twitter Card описание200 знаков максимум200150–2001 codepoint
SMS односегментное (GSM-7)160 знаковособый случай — см. ниже
SMS односегментное (UCS-2 / эмодзи)70 знаков1 codepoint
WhatsApp текст сообщения65 536 знаков1 codepoint
Тема emailбез жёсткого лимита платформы~60 на десктопе / ~30 на мобильном<501 codepoint
Google Ads заголовок30 знаков × 15 заголовковпо 30301 codepoint
Google Ads описание90 знаков × 4 описанияпо 90901 codepoint
App Store название30 знаков30301 codepoint
App Store subtitle30 знаков30301 codepoint
App Store описание4 000 знаковпервые 252 над сгибом252 для крючка1 codepoint
Play Store короткое описание80 знаков80801 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
Кодовые точки Unicode6Twitter, Instagram, SMS-шлюзы
Кластеры графем3Bluesky, программы экранного доступа, редакторы текста

Почему 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Примечание
Tweet30–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-строки и фрагменты входят в токен ссылки.

Связанное чтение

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

Все статьи