跳到主要内容

免费工具

Telegram 文本格式化,转义已经替你做好

消息里有一个价格、一个连字符和一个句号,Bot API 回了一句 "can't parse entities"。MarkdownV2 保留了 18 个字符,而一句普通的话通常就包含其中四五个。在这里写消息,选择粗体、剧透或代码块,复制出来的结果里这些字符已经全部转义。

写下你的消息

选中文本再套用样式,或者自己敲标签。输入框用的是 Telegram 的 HTML 语法,所以你编辑的内容对其中一种输出来说已经是合法的。预览只是消息的样子,不是发送按钮:这里的内容不会离开你的浏览器。

字符数 198 / 4096

Telegram 统计的是可见字符,标记本身不计费。实体和格式标签都不占用这个上限。

预览
Release 2.4 is out.
Fixed: the CSV import dropped rows ending in a comma.
Reported by three of you on the same day.
Run npm i -g entergram@2.4 to upgrade.
The migration note is boring but mandatory.
点一下剧透把它揭开,读者看到的就是这个过程。

MarkdownV2

*Release 2\.4 is out\.*
Fixed: the CSV import dropped rows ending in a comma\.
>Reported by three of you on the same day\.
Run `npm i -g entergram@2.4` to upgrade\.
The migration note is ||boring but mandatory||\.

用 parse_mode=MarkdownV2 发送。普通文本里每个保留字符都已转义;在代码片段内部,只有反斜杠和反引号需要转义。

HTML

<b>Release 2.4 is out.</b>
Fixed: the CSV import dropped rows ending in a comma.
<blockquote>Reported by three of you on the same day.</blockquote>
Run <code>npm i -g entergram@2.4</code> to upgrade.
The migration note is <tg-spoiler>boring but mandatory</tg-spoiler>.

用 parse_mode=HTML 发送。要转义的东西更少,多数库也因此把它设为默认。

两种 parse mode 的语法

Telegram 接受三种 parse mode。Markdown 是旧的那种,支持四种样式;MarkdownV2 和 HTML 支持全部十种。这张表把 MarkdownV2 和 HTML 并排放在一起。

样式MarkdownV2HTML
粗体*bold*<b>bold</b>
斜体_italic_<i>italic</i>
下划线__underline__<u>underline</u>
删除线~strike~<s>strike</s>
剧透||hidden||<tg-spoiler>hidden</tg-spoiler>
行内代码`code`<code>code</code>
代码块```python code ```<pre><code class="language-python">code</code></pre>
块引用>quoted line<blockquote>quoted</blockquote>
行内链接[text](https://example.com)<a href="https://example.com">text</a>
自定义表情![👍](tg://emoji?id=5368324170671202286)<tg-emoji emoji-id="5368324170671202286">👍</tg-emoji>

在 MarkdownV2 里,下划线和斜体不能直接嵌套,因为 __ 和 _ 在边界上会撞车。同一段文字要同时用这两种样式时,请改用 HTML。

MarkdownV2 为什么一直拒收你的消息

MarkdownV2 保留了十八个字符,在代码实体之外,每一个前面都必须加反斜杠,哪怕它在那个位置根本不可能被当成标记。这份名单是 _ * [ ] ( ) ~ ` > # + - = | { } . !,另外还有反斜杠本身,因为它就是转义字符。

其中两个让几乎所有人栽跟头。句号结束了大多数句子。连字符出现在日期、区间、命令行参数和复合词里。一条写着 "Fixed: the 2.4-rc build" 的发布说明,九个词里有三个保留字符,而 API 会整条拒收,不会把文本原样放过去。

实体内部的规则不一样,这是第二个常见误区。在行内代码或代码块里,只有反斜杠和反引号是特殊的,在那里把其他字符也转义,你的代码里就会出现可见的反斜杠。在链接或自定义表情的圆括号里,特殊的只有右括号和反斜杠。上面的工具会按上下文套用对应的规则,这正是查找替换做不到的部分。

如果这些都让你头疼,那就用 HTML。它只转义三个字符,&、< 和 >,嵌套也没有歧义。选择 MarkdownV2 的唯一理由,是它在版本库里更好读。

4096 字符的上限算的是文本,不算标记

一条 Telegram 文本消息装 4096 个字符。格式是以实体的形式跟在文本旁边传递的,不在文本里面,所以输出里看到的标签、星号和反斜杠都不计入。上面的计数器显示的是可见长度,也就是 Telegram 检查的那个数字。

旁边还有两个上限,动手写发送端之前值得知道。媒体说明文字只装 1024 个字符,所以一条单独发完全没问题的格式化消息,一旦附上图片就会被拒。超出上限的消息不会被截断:API 返回错误,什么都不发。

常见问题

这对频道帖子和普通聊天也适用,还是只适用于机器人?

语法表适用于一切通过 Bot API 或客户端库发送的内容。如果是你自己在 Telegram 里打字,应用有它自己的格式化菜单,你根本看不到 MarkdownV2。这个工具针对的是由别的程序负责发送、需要预先格式化好文本的情况。

该用哪种 parse mode?

没有特别理由的话用 HTML。它要转义三个字符而不是十八个,嵌套行为可预测,出错时通常只是多出一个可见标签,而不是整条消息被拒。MarkdownV2 在源文件里更好读,这是支持它的诚实理由。

消息发出去了,格式却没了,为什么?

几乎都是漏了 parse_mode。没有它,Telegram 会把文本当成字面内容,星号和标签就以字符的形式出现。在发送调用里把 parse_mode 设成 MarkdownV2 或 HTML,和你复制的那份输出保持一致。

能在链接里嵌粗体,或在粗体里嵌斜体吗?

可以,两种 parse mode 都行,只有一个例外:在 MarkdownV2 里下划线和斜体一起用需要绕开写法,因为分隔符会撞车。行内代码和代码块在两种模式下都不能包含任何其他样式。

自定义表情 ID 是什么,从哪里拿?

它是 Premium 自定义表情的数字 ID,要从一条已经包含该表情的消息里读出来,而不是查公开目录。发送方需要 Telegram Premium,或者是拥有该贴纸集的机器人。其他人看到的是你包住的那个备用字符。

我在这里输入的内容会被上传吗?

不会。转换在你的浏览器里完成,这个页面没有发送环节、没有账号、也没有存储。关掉标签页,消息就没了。

继续看看

同样免费: Telegram Group Finder , Telegram Lead Finder , Free QR Code Generator .

如果这段格式是为一条要发给 200 个人的消息准备的

预先转义好的文本只是群发里较小的那一半。较大的一半,是从一个别人真的会回复的账号发出去,控制好节奏让 Telegram 不生疑,再把回复收在手机以外的地方。这一半由 Entergram 负责:用真实的个人 Telegram 账号而不是机器人,每个账号走自己的代理,回复都落在同一个界面里,紧挨着联系人记录。

看看群发是怎么跑的