Форматирование текста Telegram: жирный, спойлер, MarkdownV2
Пишите с жирным, курсивом, подчёркиванием, зачёркиванием, спойлерами, кодом, ссылками и цитатами, следите за превью и копируйте текст в том виде, в каком его ждёт Telegram: MarkdownV2 со всеми экранированными символами, HTML или массив entities с офсетами в UTF-16.
Разметка: **жирный**, __курсив__, ++подчёркнутый++, ~~зачёркнутый~~, ||спойлер||, `код`, ограда ``` на отдельной строке для блока кода, [текст](url), строка с > в начале для цитаты и >> для раскрывающейся. Обратный слэш оставляет символ как есть. Ctrl или Cmd с B, I и U тоже работают.
Превью
Отправляем по всему миру с понедельника.
Для ботов и Bot API
*День запуска\.* Новая _коллекция_ уже в продаже: ~49~ 29 USD, первые 50 заказов с бесплатной доставкой\. ||Промокод: FIRST50|| Подробности: [в магазине](https://example.com/shop) >Отправляем по всему миру с понедельника\.
Отправляйте с parse_mode=MarkdownV2. Все спецсимволы уже экранированы.
<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. Символы <, > и & в вашем тексте уже заменены.
[
{
"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. Внимания требуют только три символа текста: <, > и &, заменяемые на <, > и &. Всё остальное, включая точки и дефисы, из-за которых хрупок 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.