粗体文本生成器

把英文字母逐字符换成 Unicode 里字形更粗的同类字符,一次给出数学粗体、数学粗斜体和全角字母三档结果,每档都标出每个字符落在哪个码位。

提示:文本框里按 Ctrl + Enter(macOS 用 Cmd + Enter)会立刻重新生成;单按 Enter 只换行,不会触发。每档右侧的「复制」只复制该档结果本身,不带下面的码位说明。

使用方法

  1. 在文本框里输入要转换的英文,默认已经填好 Bold 2026 这段示例。只有 A–Z 和 a–z 会被替换,中文、数字、标点一律原样保留。
  2. 结果区分三档:数学粗体、数学粗斜体、全角字母。每档上面是档位名和「复制」按钮,中间是转换结果,下面按顺序列出逐字符的真实码位(形如 U+1D401)。
  3. 想用哪一档,点它右侧的「复制」,再粘到昵称、个人简介、电商标题或签名里即可;按钮只复制结果文本,不会带上码位行。
  4. 要把整张字母表带走,点「复制码位对照表」得到制表符分隔的文本,粘进表格软件会自动分列;要进 Excel 就点「导出码位 CSV」,文件开头带 UTF-8 BOM,中文不会乱码。
  5. 按 Ctrl + Enter(macOS 用 Cmd + Enter)立刻重新生成;点「载入示例」随时把内容还原成 Bold 2026。

这个粗体文本生成器能解决什么问题

一是在只收纯文本的地方做出加粗感。社交平台的昵称、简介、电商标题这些字段不允许加粗标签,也不允许上传字体文件,把 Bold 换成 𝐁𝐨𝐥𝐝 就成了唯一能在字符层面实现"加粗"的办法,不需要图片,也不会被头像框裁掉。

二是在一段话里只强调几个词。本页按字符处理,同一句里可以只改你想突出的部分,其余保持原样,不用整段替换。

三是用全角字母做对齐。全角字母(A 到 Z、a 到 z)每个都占一个汉字宽,做竖排标题、编号、表头时比半角整齐;它同时也是本页三档里最不容易被平台打回的一档。

四是核对一段文字到底有哪些码位。每档结果下面直接列出逐字符码位,排查"为什么粘过去变成了方框""为什么搜索搜不到"时,比肉眼逐字比对可靠得多。

本页不做这些事:不安装字体文件(它是换字符,不是换字体)、不做连笔风格、不做倒序镜像、不做删除线、只映射字母不映射数字。想要一次看十几种字形风格,请用「特殊字体生成器」;只要斜体请用「斜体文本生成器」;全角与半角互转请用「全角半角转换」。

生成原理:Unicode 码位、区块空位与代理对

这个粗体文本生成器只做一件事:把输入按码点切成字符,逐个判断是不是 A–Z 或 a–z,是就换成一个码位不同、字形加粗的 Unicode 字符,再拼回去。用到的两个 API 是 str.codePointAt(0) 和 String.fromCodePoint()。

为什么必须用 codePointAt 而不是 charCodeAt。本页用到的数学字母在 U+1D400 一带,码位大于 U+FFFF,在 JavaScript 的 UTF-16 字符串里会被拆成一对代理码元。charCodeAt 只能读到高代理那一半:'𝐀'.charCodeAt(0) 得到的是 55349,一个没有意义的值;只有 codePointAt(0) 才还原出完整的 119808,也就是 U+1D400。同理,切分输入要用 Array.from(str) 或展开运算符,不能按 str.length 循环,否则会把一个代理对从中间劈开,输出两个乱码字符。

三档映射都是"基址加序号"。数学粗体的大写从 U+1D400 起、小写从 U+1D41A 起,所以 U+1D400 + (ch − 'A') 就是结果;数学粗斜体的大写从 U+1D468 起、小写从 U+1D482 起;全角最整齐,A–Z 落在 U+FF21–U+FF3A、a–z 落在 U+FF41–U+FF5A,相当于把 ASCII 加一个固定偏移 0xFEE0(十进制 65248)。抓住这三组基址,26 个字母的映射就是一行代码。

但"基址加序号"只在整族满员时才成立。整个数学字母数字符号区块是 U+1D400–U+1D7FF,共 1024 个码位,实测只有 996 个真正分配了字符,剩下 28 个是历史遗留空位:这些字母早年已经在别的区块单独编过码,新区块为了不出现"一个字符两个码位",就把老位置空着。举一个能当场验证的例子:双线体大写 Z 的位置 U+1D551 是空的,真正的 ℤ 在 U+2124,同族的 ℂ 在 U+2102、ℕ 在 U+2115。所以写一个通用转换器时,每一族都得单独核对覆盖表,不能拿一个基址从头推到尾。

本页这三档恰好都是满员族。把 28 个空位按族归类会发现:它们全部落在非粗体族里——斜体、Script、Fraktur、双线体各有若干字母缺位;而带 Bold 的四个族(Bold、Bold Italic、Bold Script、Bold Fraktur)一个字母都没缺。也正因如此,本页可以用最简单的基址推导,不会因为某一位恰好是空位而输出一个没法显示的空码位。别把"满员"当成通例,它只是这三族的运气,换一个族就得重新核对。

数字为什么不并入本页。数学粗体的数字并不紧跟在字母后面,而是另起一段落在 U+1D7CE(数学粗体数字零);全角数字也在 U+FF10 起。这两段与本页映射的字母段不相邻,为了避免把"粗体"讲成"粗体字母加粗体数字"两件事,本页只映射字母,数字与标点原样保留。

完整示例(数值仅作演示)

示例条件就是页面打开时文本框里的那段文字:Bold 2026,一共 9 个字符(含 1 个空格)。下面把这一串在数学粗体档下的逐字符码位列出来,可以拿它和结果区第一行下面的码位行逐位对照:

整串结果是 𝐁𝐨𝐥𝐝 2026,码位序列为 U+1D401 U+1D428 U+1D425 U+1D41D U+0020 U+0032 U+0030 U+0032 U+0036。同一串在数学粗斜体档下是 𝑩𝒐𝒍𝒅 2026,码位 U+1D469 U+1D490 U+1D48D U+1D485;在全角档下是 Bold 2026,码位 U+FF22 U+FF4F U+FF4C U+FF44。三档结果里 2026 都保持原样,因为本页只映射字母。数值仅作演示:码位是固定的 Unicode 分配结果,与你的输入无关;显示得好不好看则取决于本机字体。

字母、三档风格与码位对照表

下表把 26 个字母在三档风格下的结果与码位全部列出,大小写放在同一行。码位列写作「大写/小写」,例如 A 行是 U+1D400/U+1D41A。表里每一行都可以用基址加序号自己复核一遍。

字母数学粗体粗斜体全角字母
A / a𝐀𝐚
U+1D400/U+1D41A
𝑨𝒂
U+1D468/U+1D482
Aa
U+FF21/U+FF41
B / b𝐁𝐛
U+1D401/U+1D41B
𝑩𝒃
U+1D469/U+1D483
Bb
U+FF22/U+FF42
C / c𝐂𝐜
U+1D402/U+1D41C
𝑪𝒄
U+1D46A/U+1D484
Cc
U+FF23/U+FF43
D / d𝐃𝐝
U+1D403/U+1D41D
𝑫𝒅
U+1D46B/U+1D485
Dd
U+FF24/U+FF44
E / e𝐄𝐞
U+1D404/U+1D41E
𝑬𝒆
U+1D46C/U+1D486
Ee
U+FF25/U+FF45
F / f𝐅𝐟
U+1D405/U+1D41F
𝑭𝒇
U+1D46D/U+1D487
Ff
U+FF26/U+FF46
G / g𝐆𝐠
U+1D406/U+1D420
𝑮𝒈
U+1D46E/U+1D488
Gg
U+FF27/U+FF47
H / h𝐇𝐡
U+1D407/U+1D421
𝑯𝒉
U+1D46F/U+1D489
Hh
U+FF28/U+FF48
I / i𝐈𝐢
U+1D408/U+1D422
𝑰𝒊
U+1D470/U+1D48A
Ii
U+FF29/U+FF49
J / j𝐉𝐣
U+1D409/U+1D423
𝑱𝒋
U+1D471/U+1D48B
Jj
U+FF2A/U+FF4A
K / k𝐊𝐤
U+1D40A/U+1D424
𝑲𝒌
U+1D472/U+1D48C
Kk
U+FF2B/U+FF4B
L / l𝐋𝐥
U+1D40B/U+1D425
𝑳𝒍
U+1D473/U+1D48D
Ll
U+FF2C/U+FF4C
M / m𝐌𝐦
U+1D40C/U+1D426
𝑴𝒎
U+1D474/U+1D48E
Mm
U+FF2D/U+FF4D
N / n𝐍𝐧
U+1D40D/U+1D427
𝑵𝒏
U+1D475/U+1D48F
Nn
U+FF2E/U+FF4E
O / o𝐎𝐨
U+1D40E/U+1D428
𝑶𝒐
U+1D476/U+1D490
Oo
U+FF2F/U+FF4F
P / p𝐏𝐩
U+1D40F/U+1D429
𝑷𝒑
U+1D477/U+1D491
Pp
U+FF30/U+FF50
Q / q𝐐𝐪
U+1D410/U+1D42A
𝑸𝒒
U+1D478/U+1D492
Qq
U+FF31/U+FF51
R / r𝐑𝐫
U+1D411/U+1D42B
𝑹𝒓
U+1D479/U+1D493
Rr
U+FF32/U+FF52
S / s𝐒𝐬
U+1D412/U+1D42C
𝑺𝒔
U+1D47A/U+1D494
Ss
U+FF33/U+FF53
T / t𝐓𝐭
U+1D413/U+1D42D
𝑻𝒕
U+1D47B/U+1D495
Tt
U+FF34/U+FF54
U / u𝐔𝐮
U+1D414/U+1D42E
𝑼𝒖
U+1D47C/U+1D496
Uu
U+FF35/U+FF55
V / v𝐕𝐯
U+1D415/U+1D42F
𝑽𝒗
U+1D47D/U+1D497
Vv
U+FF36/U+FF56
W / w𝐖𝐰
U+1D416/U+1D430
𝑾𝒘
U+1D47E/U+1D498
Ww
U+FF37/U+FF57
X / x𝐗𝐱
U+1D417/U+1D431
𝑿𝒙
U+1D47F/U+1D499
Xx
U+FF38/U+FF58
Y / y𝐘𝐲
U+1D418/U+1D432
𝒀𝒚
U+1D480/U+1D49A
Yy
U+FF39/U+FF59
Z / z𝐙𝐳
U+1D419/U+1D433
𝒁𝒛
U+1D481/U+1D49B
Zz
U+FF3A/U+FF5A

补充一点:全角那一档只覆盖字母。ASCII 的空格 U+0020 加上 0xFEE0 会得到 U+FF00,那是个未分配码位,所以全角档下空格仍保持半角——这也是很多"全角文本"看着对齐、实际错一格的原因。

输入范围、边界与兼容性说明

常见问题

转换成粗体以后还能被搜索到吗?

不能。搜索引擎和站内搜索都按码位序列匹配,𝐛𝐨𝐥𝐝 与 bold 是两组完全不同的码位,互相搜不到。如果这段文字要被人搜到、被爬虫收录,请用普通文字。

为什么数字没有一起变粗?

因为本页只映射字母。数学粗体的数字不紧跟在字母后面,而是另起一段落在 U+1D7CE(数学粗体数字零);全角数字也在 U+FF10 起,两段都与本页的字母段不相邻,所以故意不并入。想让数字也变粗,请用专门映射数字风格的页面。

数学粗体和数学粗斜体有什么区别?

它们是两组独立码位,不是同一族。数学粗体大写从 U+1D400 起、小写从 U+1D41A 起;数学粗斜体大写从 U+1D468 起、小写从 U+1D482 起,字形带倾斜笔画。粗斜体并不是"粗体再加一个斜体符号",而是一个单独分配、本身就已经是粗斜造型的字符。

为什么在有些设备上显示成方框?

方框表示你当前用的字体没有这个码位的字形,渲染器沿 fallback 字体链找完都没找到,就画一个空心方框(正式名 .notdef)。换一款覆盖更全的数学字体能解决你自己这端,但对方看到的仍是方框。想稳妥就用全角档,它的字体覆盖率最高。

粘贴到微信、Word 之后样式没了,是工具的问题吗?

不是。这些软件在入库或渲染时会做一次 NFKC 归一化或全半角折叠,把数学粗体、粗斜体、全角字母统统打回普通字符(实测 U+1D400、U+1D468、U+FF21 三种都会被折叠回普通 A)。全角那一族抗折叠能力最强,但依然可能在某些安卓字体下显示成方框。

为什么必须用 codePointAt,用 charCodeAt 不行吗?

不行。数学字母的码位大于 U+FFFF,在 UTF-16 里占两个码元。用 charCodeAt(0) 读到的是高代理 55349,而不是真正的 119808(U+1D400);用它去查表必然算错。同理,切分输入要用 Array.from(),否则一个代理对会被从中间劈开。

「复制码位对照表」和「导出码位 CSV」有什么区别?

前者把码位表以制表符分隔的文本写进剪贴板,粘进表格软件会自动分列;后者下载一个开头带 UTF-8 BOM 的 .csv 文件,双击用 Excel 打开不会中文乱码。两者内容一致,只是用途不同。

输入的内容会传到服务器吗?

不会。这个粗体文本生成器的映射表、切分和拼回都在当前页面的脚本里完成,全程没有网络请求,也不写浏览器存储。打开开发者工具的 Network 面板,边输入边观察,不会有任何新请求发出。

相关工具