Бесплатный инструмент

Форматирование текста Telegram: жирный, спойлер, MarkdownV2

Пишите с жирным, курсивом, подчёркиванием, зачёркиванием, спойлерами, кодом, ссылками и цитатами, следите за превью и копируйте текст в том виде, в каком его ждёт Telegram: MarkdownV2 со всеми экранированными символами, HTML или массив entities с офсетами в UTF-16.

Разметка: **жирный**, __курсив__, ++подчёркнутый++, ~~зачёркнутый~~, ||спойлер||, `код`, ограда ``` на отдельной строке для блока кода, [текст](url), строка с > в начале для цитаты и >> для раскрывающейся. Обратный слэш оставляет символ как есть. Ctrl или Cmd с B, I и U тоже работают.

180 из 4 096 символов · 180 единиц UTF-16, в них считаются офсеты сущностей

Превью

День запуска. Новая коллекция уже в продаже: 49 29 USD, первые 50 заказов с бесплатной доставкой. Подробности: в магазине
Отправляем по всему миру с понедельника.
Кладёт текст в буфер обмена как HTML и как обычный текст. Сохранится ли форматирование при вставке, зависит от приложения Telegram; если пришло без него, возьмите MarkdownV2 или HTML ниже.

Для ботов и Bot API

MarkdownV2
*День запуска\.* Новая _коллекция_ уже в продаже: ~49~ 29 USD, первые 50 заказов с бесплатной доставкой\.
||Промокод: FIRST50||
Подробности: [в магазине](https://example.com/shop)
>Отправляем по всему миру с понедельника\.

Отправляйте с parse_mode=MarkdownV2. Все спецсимволы уже экранированы.

HTML
<b>День запуска.</b> Новая <i>коллекция</i> уже в продаже: <s>49</s> 29 USD, первые 50 заказов с бесплатной доставкой.
<tg-spoiler>Промокод: FIRST50</tg-spoiler>
Подробности: <a href="https://example.com/shop">в магазине</a>
<blockquote>Отправляем по всему миру с понедельника.</blockquote>

Отправляйте с parse_mode=HTML. Символы <, > и & в вашем тексте уже заменены.

Entities
[
  {
    "type": "bold",
    "offset": 0,
    "length": 13
  },
  {
    "type": "italic",
    "offset": 20,
    "length": 9
  },
  {
    "type": "strikethrough",
    "offset": 45,
    "length": 2
  },
  {
    "type": "spoiler",
    "offset": 98,
    "length": 17
  },
  {
    "type": "text_link",
    "offset": 129,
    "length": 10,
    "url": "https://example.com/shop"
  },
  {
    "type": "blockquote",
    "offset": 140,
    "length": 40
  }
]

Отправляйте чистый текст в text и этот массив в entities, без parse_mode. Офсеты и длины в единицах UTF-16.

Лимиты считаются по тексту без разметки: 4 096 символов на сообщение, 1 024 на подпись. Как устроен подсчёт

Форматирование в Telegram не типографика, а данные. Жирное слово это сущность: тип, офсет и длина, прикреплённые к обычному тексту. Приложения его рисуют, боты отправляют, и всё, что ломается в отформатированном сообщении, ломается в той точке, где текст превращается в сущности.

Десять стилей, одна разметка

Поле выше принимает небольшую разметку и превращает её в сущности по мере набора: **жирный**, __курсив__, ++подчёркнутый++, ~~зачёркнутый~~, ||спойлер||, пара обратных кавычек для кода в строке, ограда ``` на отдельной строке для блока кода (язык указывается после открывающей ограды), [текст](url) для ссылки, строка с > в начале для цитаты и с >> для раскрывающейся. Обратный слэш перед любым из этих символов оставляет его текстом. Стили вкладываются друг в друга, поэтому ссылка может стоять внутри жирного, а жирный внутри цитаты; код не содержит ничего, а цитата не содержит ни другую цитату, ни блок кода. Это правила вложенности самого Telegram, а не ограничение страницы.

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

MarkdownV2: экранирование, на котором ломаются боты

parse_mode=MarkdownV2 показывают в большинстве учебников, и он же стоит за большинством ошибок «can’t parse entities». Правило короткое и безжалостное: вне кода перед каждым из символов _ * [ ] ( ) ~ ` > # + - = | { } . ! должен стоять обратный слэш, и перед самим обратным слэшем тоже. Одной неэкранированной точки в конце предложения достаточно, чтобы API отверг всё сообщение. Внутри code и pre экранируются только обратная кавычка и обратный слэш; внутри адресной части ссылки только закрывающая скобка и обратный слэш.

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

HTML: три символа на экранирование

parse_mode=HTML спокойнее. Telegram поддерживает фиксированный список тегов: b, i, u, s, tg-spoiler, a, code, pre (с вложенным code class="language-…" для названия языка) и blockquote, обычный или expandable. Внимания требуют только три символа текста: <, > и &, заменяемые на &lt;, &gt; и &amp;. Всё остальное, включая точки и дефисы, из-за которых хрупок MarkdownV2, уходит как есть. Именно этот формат AdminHub использует, когда публикует посты, и его же стоит выбрать для любого бота, написанного с нуля.

Entities, если экранировать не хочется вовсе

Третий выход это массив entities. Отправьте его вместе с чистым текстом и без parse_mode, и экранировать будет нечего, потому что ничего не разбирается. Знать нужно одно: офсеты и длины считаются в единицах UTF-16, поэтому эмодзи или любой символ вне базовой многоязычной плоскости занимает две. Ровно поэтому счётчик показывает это число отдельно.

Какой длины может быть сообщение

В сообщение помещается 4 096 символов, в подпись к медиа 1 024, и оба лимита считаются «после разбора сущностей»: разметка, теги и экранирующие слэши не учитываются, только видимый читателю текст. Лимиты заданы в символах, которые клиентская конфигурация Telegram считает кодовыми точками, поэтому жирный эмодзи это один символ против лимита, хотя его сущность длиной в две единицы. Счётчик выше следует этому правилу и переключается между двумя лимитами; генератор шрифтов объясняет то же различие для стилизованных букв Юникода.

Чего этот инструмент не делает

Пользовательские эмодзи и сущности даты tg-time требуют бота с особыми правами и оставлены за скобками. Устаревший режим Markdown не включён намеренно: он не умеет вкладывать стили, не выражает подчёркивание, зачёркивание, спойлеры и цитаты, и документация Telegram сама отсылает к MarkdownV2. Заголовки, таблицы и списки тоже не относятся к обычному форматированию сообщений: Telegram ввёл их в июле 2026 года как отдельный текстовый редактор для пользователей Premium, а для ботов это rich-сообщения Bot API 10.1, которые и создаёт редактор постов AdminHub. Стили с этой страницы каждый клиент Telegram отображает одинаково.


Источники, проверены в сентябре 2026: Bot API, Formatting options для правил экранирования MarkdownV2, списка тегов HTML, правил вложенности и лимитов «после разбора сущностей»; Bot API, MessageEntity для офсетов и длин в единицах UTF-16; Styled text with message entities о том, как клиенты считают длины сущностей; блог Telegram, 14 июля 2026 о текстовом редакторе и его доступности только для Premium.

Что обычно спрашивают

Как сделать жирный текст в Telegram?
Напишите его здесь между двойными звёздочками или выделите и нажмите «Жирный», а потом скопируйте результат в нужном виде. Для бота отправьте текст как <b>жирный</b> с parse_mode=HTML или как *жирный* с parse_mode=MarkdownV2, где все остальные спецсимволы нужно экранировать. Эта страница описывает то, что документирует Bot API, а не кнопки каждого приложения.
Почему бот получает ошибку can't parse entities?
Потому что сообщение отправлено с parse_mode=MarkdownV2 и содержит неэкранированный спецсимвол, чаще всего точку, дефис, восклицательный знак или скобку, либо стиль открыт и не закрыт. В HTML та же ошибка приходит из-за незакрытого или неподдерживаемого тега или голых < и & в тексте. Вставьте текст сюда и скопируйте выход MarkdownV2 или HTML: экранирование и закрытие уже сделаны.
HTML или MarkdownV2: что выбрать для бота?
HTML, если нет причин поступить иначе. В нём экранируются три символа вместо восемнадцати, нет путаницы между подчёркиванием и курсивом, и именно его AdminHub отправляет в Telegram для каждого поста с форматированием. MarkdownV2 уместен, когда его собирает ваша библиотека или когда вы копируете его из такого инструмента, как этот.
Как спрятать текст под спойлер?
Оберните его в двойные вертикальные черты, ||вот так||, или выделите и нажмите «Спойлер». В MarkdownV2 спойлер пишется так же, в HTML это тег tg-spoiler, а у сущности тип spoiler. Читатель видит размытый блок, пока не нажмёт на него.
Можно ли использовать заголовки, таблицы или списки в сообщении Telegram?
В обычном форматировании сообщений нет, и этот инструмент их не создаёт. Telegram добавил заголовки, таблицы и списки в июле 2026 года как отдельный текстовый редактор для пользователей Premium; для ботов это rich-сообщения Bot API 10.1, именно так их отправляет редактор постов AdminHub. Все стили на этой странице работают в любом чате.
Какой длины может быть отформатированное сообщение?
4 096 символов для сообщения и 1 024 для подписи к медиа, считая по тексту после удаления разметки: теги, звёздочки и экранирующие слэши не учитываются. Счётчик под полем применяет то же правило и переключается между двумя лимитами.
Почему длина сущности не совпадает с числом символов?
Офсеты и длины сущностей считаются в единицах UTF-16, поэтому эмодзи или любой символ вне базовой плоскости занимает две, а лимит сообщения считается в символах. Счётчик показывает оба числа: первое решает, влезет ли сообщение, второе попадает в массив entities.