Telegram formatting: the markdown it actually reads

Telegram understands a very short list of formatting characters — bold, italic, code, quotes and links — and it is far stricter about them than Discord. Copy styled text from a website and it arrives plain. Paste a sentence containing an underscore into a MarkdownV2 message and the whole message is refused. Here is the exact syntax Telegram reads, what genuinely breaks, and what to use for the styles it does not have.

Why Telegram formatting fails on pasted text

Telegram does not read formatting from your clipboard. It reads characters. Everything the client draws as bold or italic is a decision it makes by parsing the plain text of the message, and whatever it did not ask for is discarded.

Highlight a line on a web page and copy it, and the clipboard receives six plain letters plus a hidden tag saying render these bold. That tag is HTML, and Telegram is not an HTML renderer. It takes the letters, looks for an asterisk, finds none, and delivers the message unstyled. Word and Google Docs are worse: their bold is a font attribute that never leaves the document as text at all.

Telegram is also fussier about the characters that really are there. A full stop, a hyphen or an underscore sitting in ordinary prose is perfectly legal in a normal chat, but every one of them is reserved syntax in MarkdownV2. There is no forgiving fallback, so depending on how the message is being sent those characters produce mangled output or stop the message being delivered at all.

A second source of confusion has nothing to do with pasting. Humans and bots send differently. A person typing in a chat uses the legacy Markdown parser unless they tap the formatting button or press Ctrl+Shift+M. A bot sends through the Bot API, declares a parse_mode, and gets the strict parser. The identical string can look perfect in one chat and fail in the next.

Telegram formatting lives in the characters, or it does not exist. The alternative is to stop asking Telegram to style the text and replace each letter with a styled version of itself — bold 𝗔, script π’œ, fullwidth οΌ‘. Nothing to parse, nothing to escape, nothing a paste or a forward can strip.

Telegram Markdown vs MarkdownV2

Telegram has two parsers and they are not interchangeable. The mode belongs to the message rather than to the client, which is why the same sentence can work in one place and fail in another.

Markdown is the legacy parser and the default for ordinary chats. It understands *bold*, _italic_, backtick code and [label](url) links. It is lenient: most stray characters pass through untouched, because the parser only reacts to the markers it recognises.

MarkdownV2 is the strict parser. You select it with the format button on the compose bar or with Ctrl+Shift+M on desktop, and bots ask for it by sending parse_mode: MarkdownV2. It covers more syntax, including spoilers, expandable quotes and nested lists, but every reserved character has to carry a backslash first.

MarkdownV2 does not degrade gracefully. When a strict-mode message contains one unescaped reserved character, Telegram rejects the whole thing rather than rendering the parts it understands. A bot gets an API error naming the character; a human gets an empty compose box that refuses to send. If your text is full of ordinary punctuation, either write it in legacy Markdown or escape it properly — do not guess which characters matter.

Characters MarkdownV2 reserves, and the escape each one needs.
CharacterType this insteadWhy Telegram reserves it
Bold and italic\* \_Asterisk opens bold, underscore opens italic
Inline code\`Backtick opens and closes a code span
Strikethrough and spoiler\~Tilde opens and closes both styles
Link syntax\[ \] \( \)Brackets and parentheses build links and callbacks
Quote\>A greater-than sign at the start of a line marks a block quote
Heading\#Hash signs at line start mark heading levels
Lists and separators\+ \- \= \|Markers for bullets, dashes and table-style rows
Braces, dots, exclamation\{ \} \. \!Reserved by the legacy bold-link form and trailing punctuation
Everything elseLeave it unescapedOrdinary letters, digits and spaces never need escaping

The syntax Telegram reads

This is the complete set Telegram honours when you write the markup out by hand. The first rows work in both modes. The last three are the honest part of the picture: Telegram has no underline, no strikethrough and no headings, so this formatter falls back to bold instead of pretending the style was applied.

What you type, and what Telegram shows.
StyleType thisResult
Bold*bold*Bold
Italic_italic_Italic
Bold and italic*_both_*Bold and italic
Inline code`code`Monospace, with emphasis markers left literal
Quote> quoted at the start of the lineIndented block quote
Bullet list• itemBulleted line
Numbered list1) itemNumbered line, using a bracket rather than a full stop
Link[label](https://example.com)Clickable link
UnderlineNot supportedDegrades to bold
StrikethroughNot supportedDegrades to bold
HeadingNot supportedDegrades to bold

Note the two details that catch people copying from other platforms. Telegram's bold is a single asterisk on each side, not the double asterisk that Discord, Reddit and GitHub use. And the numbered-list marker is a closing bracket, 1), not a full stop, which is why 1. Buy milk comes through as an ordinary sentence while 1) Buy milk becomes a list item.

Formatting Telegram cannot do

Telegram's parser is genuinely small. There is no underline, no strikethrough, no heading level and no colour, and there is no setting or Premium feature that switches any of them on. A Telegram client renders one message style, and the only weight and slant a sender controls comes from bold and italic.

That leaves two honest ways forward. Fake it with the styles that exist: a bold line reads as a heading to someone scrolling a channel, and italic carries emphasis about as well as colour would at the size most people read on a phone. That is a technique, not a workaround, and it is exactly what the fallback in the table above does. The second option is to stop using markup altogether and let the characters carry the style.

Two ways out, both legitimate. Fake it with what Telegram has — bold for headings, italic for emphasis, a bullet for structure — and it will look deliberate on every client, including ones you have not tested. Or use Unicode characters: 𝗔 𝗕 𝗖, π’œ 𝓑 π’ž, 𝗔𝗕𝗖. These are ordinary letters with different code points, so Telegram draws them as styled text with no parser, no escaping and no mode to choose.

Unicode text in Telegram

Telegram draws messages with the system font and falls back across installed fonts for anything the primary font lacks, which is why Mathematical Alphanumeric Symbols come out cleanly on Android, iOS, Telegram Desktop and the web client alike. These are the same characters the formatter produces:

𝗕𝗼𝗹𝗱Sans bold
π˜‰π˜°π˜­π˜₯Sans italic
𝔹𝕠𝕝𝕕Double struck
ℬℴ𝓁𝒹Script
𝔅𝔬𝔩𝔑Fraktur
π™±πš˜πš•πšMonospace
οΌ’ο½ο½Œο½„Fullwidth
β’·β“žβ“›β““Circled
Κ™α΄ΚŸα΄…Small caps
𝗕𝗼𝗹𝗱 𝗧𝗲𝗫𝗧Works everywhere

Two constraints are worth knowing before you commit to it. A message holds 4096 characters; Premium allows longer messages, but 4096 is the standard per-message cap. Unicode letters above U+FFFF are surrogate pairs and count as two characters each, so a styled heading or name can cost twice its visible length. And Telegram restricts channel usernames to letters, numbers and underscores — an @handle cannot contain fancy characters and the field drops them silently. Display titles, group names, bios and post text carry no such restriction.

Where to use it. Channel display titles, group names, profile bios, post text and chat messages all accept Unicode and render it identically on every client. Channel handles do not, so keep those ASCII. Because the styling travels as characters rather than markup, styled text survives being copied, forwarded, or opened on a client you have never used.

Common mistakes

Frequently asked questions

Why does my Telegram markdown not work when I paste from another app?

Telegram does not read formatting from the clipboard. It parses the plain characters of the message you send. When you copy styled text from a web page, the bold exists only as a hidden HTML tag; when you copy from Word or Google Docs, it exists only as a font attribute. Telegram is not an HTML renderer, so it takes the letters, finds no asterisk or underscore around them, and delivers the message plain.

Fix it by typing the markup inside Telegram, or by using Unicode characters that need no markup at all.

What is the difference between Markdown and MarkdownV2 in Telegram?

Markdown is the legacy parser and the default for ordinary chats. It is lenient: it looks for *bold*, _italic_, backtick code and links, and ignores characters it does not recognise.

MarkdownV2 is the strict parser, selected with the format button on the compose bar or Ctrl+Shift+M on desktop, and requested by bots with parse_mode: MarkdownV2. It supports more syntax, but every reserved character must be escaped, and an unescaped one makes Telegram reject the whole message instead of rendering the rest.

Why is my snake_case variable name broken in Telegram?

Because underscore is Telegram's italic delimiter. In MarkdownV2 every underscore is reserved syntax, not just the ones at a word boundary, so an identifier such as user_name_hash is parsed as emphasis and the middle of the word comes out italic.

Wrap the identifier in backticks, which puts it in a code span where emphasis markers are literal, or escape each underscore with a backslash.

How do I make a heading in a Telegram message?

Telegram has no headings, so hash syntax does nothing useful — a line starting with # renders with a literal hash in front of it.

Bold the line instead, with a single asterisk on each side. Bold reads as a heading to anyone scrolling a channel, and it is the only approach that survives being copied out of Telegram and pasted somewhere else.

Does Unicode fancy text work in Telegram?

Yes. Telegram draws messages with the system font and falls back across installed fonts for characters the primary font lacks, so Mathematical Alphanumeric Symbols such as bold or script letters render on Android, iOS, Telegram Desktop and the web client.

Because the styling is carried by the characters themselves, it survives copy, paste and forwarding, and it needs no parser, no escaping and no choice of markdown mode.

Can I use fancy characters in a Telegram channel username?

No. Telegram restricts channel usernames to letters, numbers and underscores, and silently drops anything else you enter. The handle is the one place fancy text cannot go.

Channel display titles, group names, profile bios, post text and chat messages have no such restriction and accept Unicode normally.

Part of the free Unicode Formatter on aczh.dev — no sign-up, no ads, and no text ever leaves your browser. Verified against Telegram Desktop, Telegram mobile and the web client in October 2026.