使用方法
- 在文本框里输入要转换的英文,默认已经填好 Bold 2026 这段示例。只有 A–Z 和 a–z 会被替换,中文、数字、标点一律原样保留。
- 结果区分三档:数学粗体、数学粗斜体、全角字母。每档上面是档位名和「复制」按钮,中间是转换结果,下面按顺序列出逐字符的真实码位(形如
U+1D401)。 - 想用哪一档,点它右侧的「复制」,再粘到昵称、个人简介、电商标题或签名里即可;按钮只复制结果文本,不会带上码位行。
- 要把整张字母表带走,点「复制码位对照表」得到制表符分隔的文本,粘进表格软件会自动分列;要进 Excel 就点「导出码位 CSV」,文件开头带 UTF-8 BOM,中文不会乱码。
- 按 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 个空格)。下面把这一串在数学粗体档下的逐字符码位列出来,可以拿它和结果区第一行下面的码位行逐位对照:
BU+0042 →𝐁U+1D401(B 是大写里第 2 个,1D400 + 1)oU+006F →𝐨U+1D428(o 是小写里第 15 个,1D41A + 14)lU+006C →𝐥U+1D425dU+0064 →𝐝U+1D41D- 空格 U+0020 → 空格 U+0020(空格不在映射范围,原样保留)
2U+0032 →2U+0032(数字不并入本页映射)026→ 原样,码位 U+0030 U+0032 U+0036
整串结果是 𝐁𝐨𝐥𝐝 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,那是个未分配码位,所以全角档下空格仍保持半角——这也是很多"全角文本"看着对齐、实际错一格的原因。
输入范围、边界与兼容性说明
- 输入上限 200 个 UTF-16 码元(文本框的
maxlength)。要注意:数学字母在 UTF-16 里占 2 个码元,所以你把已经转换过的结果再粘回来,实际只能再放约 100 个字符;纯 ASCII 输入才能放满 200 个。 - 只有 A–Z、a–z 参与映射。中文、日文、标点、emoji、数字一律原样保留;输入一段中文会得到一模一样的中文,结果区会提示本次输入里没有可映射的字符。
- 粘到 Word 或微信后可能回退,甚至显示成方框。Word 的"粘贴并匹配格式"、以及微信/微博/抖音入库时的一次清洗,都可能对文本做 NFKC 归一化;实测 𝐀(U+1D400)、𝑨(U+1D468)、A(U+FF21)过一遍
normalize('NFKC')都会被折叠回普通 A。显示成空心方框 □ 是另一回事:那是当前字体没有这个码位的字形,沿 fallback 字体链找完都没有,就画方框(正式名.notdef)。方框取决于对方设备,你无法替他解决。 - 屏幕阅读器不会把它念成字母。每个码位都有官方名称,𝐁 的名字是 MATHEMATICAL BOLD CAPITAL B,读屏软件念的是这一长串名字,或者直接跳过当作无意义符号;网页搜索也一样,用普通
bold匹配不到𝐛𝐨𝐥𝐝。把结果用在正文、按钮、表单标签上,等于对读屏用户和爬虫同时隐身。 - 不要拿它当密码、网址或账号名。这类字符在不同系统里的归一化行为不一致,容易出现"我明明输对了却登录不上";多数用户名规则也会直接判定"含非法字符"。
- 全角档的兼容性最好。全角字母的字体覆盖率远高于数学字母,被归一化的概率也更低,是"必须跨设备可用"时最稳妥的一档。
常见问题
转换成粗体以后还能被搜索到吗?
不能。搜索引擎和站内搜索都按码位序列匹配,𝐛𝐨𝐥𝐝 与 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 面板,边输入边观察,不会有任何新请求发出。