⭐ 觉得好用?收藏备用,下次直接打开 ✨ 开通会员去广告 · 更多权益即将开放 ☕ 支持作者
两套渲染分开做,因为它们根本不是一回事:英文用 figlet 的 .flf 字体,20 款字形; 中文把字画出来再采样成点阵,可选黑/宋/楷/圆/仿宋五种字体 × 实心/灰度/轮廓/反白四种填充风格。FIGfont 规范里压根没有汉字字形, 拿英文字体去渲染中文,出来的是一片空白 —— 这不是取舍,是格式本身的边界。
文字
渲染方式
字体(20 款)
字间距
结果 —
 
上面输入文字,这里实时出图

ASCII 艺术字生成把文字转成字符画,两种渲染分开走:英文用 figlet 字体,中文用点阵采样。全部在浏览器里算,不上传任何内容。

两种模式的分工

英文字体(figlet)中文点阵
原理查 .flf 字体里预设的字形canvas 画字 → 取像素 → 映射字符
能处理ASCII 字母、数字、常见符号任何系统字体能显示的字,含中文、日文
字形20 款预设字体黑 / 宋 / 楷 / 圆 / 仿宋,取决于本机装了哪些
造型字体自带(立体、阴影、空心…)实心 / 灰度 / 轮廓 / 反白 四种填充风格
还能调字间距输出行数、笔画阈值、填充字符、字重

中文没法走 figlet,不是取舍问题:.flf 格式定型于 1991 年,字形表里就没有汉字码点。任何号称「支持中文的 figlet」要么内置了自制的汉字点阵字库,要么做的就是这里的第二种方案。

中文想出效果,按这个顺序调

  1. 输出行数 —— 相当于分辨率,影响最大。6 行只能看出轮廓,12 行能认,16 行以上笔画才真正清楚。代价是宽度同比例增加
  2. 字体 —— 黑体最耐小字号;宋体、楷体要 16 行以上才显出味道。同一句话换款字体,骨架完全不同
  3. 填充风格 —— 想要最接近原字形就选灰度;要贴进纯文本环境、字符种类越少越好就用实心
  4. 笔画阈值 —— 调小笔画变粗、更连贯,调大变细、更有空隙。笔画密的字(「赢」「囊」)往小调

20 款英文字体是怎么选的

figlet 完整字体库有 331 款,全打进去是 18.8 MB,显然不行。这里挑的 20 款覆盖了常见造型(标准、加大、紧凑、斜体、方块、阴影、立体、等距、手写、数码管等),压缩后约 46 KB,随页面一起加载,切换零延迟。

关于「ASCII」这个名字

严格说,用块字符(█ ▓ ░)画出来的不叫 ASCII art,那些字符不在 ASCII 表里。但中文语境下「ASCII 字符画」早就成了这类东西的统称,所以工具名照习惯叫。真要严格只用 ASCII,填充字符选纯 ASCII 那一组、字符梯度选「简单」或「细腻」就行。

📍使用场景

  • 给项目 README 加个标题横幅开源项目顶部那行大字,选「巨大」或「实心阴影」,复制进 Markdown 的代码块里就成。
  • 终端程序的启动 bannerCLI 工具跑起来先刷一屏项目名,下载 TXT 后按语言拼成字符串常量即可。
  • 把中文做成字符画公司名、群名、活动名转成点阵字符。五种字体配四种填充风格,二十种组合里总有一种对味。
  • 代码注释里的分区标记长文件里用「迷你」或「紧凑」字体做段落分隔,比一排井号更容易扫到。

❓常见问题

为什么输中文出来是空白?

因为 figlet 字体里没有汉字。 figlet 用的是 .flf 字体文件,这个格式诞生于 1991 年,收录范围基本就是 ASCII 加上部分 Latin-1,汉字、日文、emoji 的码点根本不在里面,渲染时会被直接跳过。这不是工具没做好,是 FIGfont 规范本身的边界。所以中文要切到「中文点阵」模式,走的是完全不同的一条路:先用系统字体把字画到画布上,再逐块采样成字符。页面检测到非 ASCII 字符时会直接弹提示,点一下就切过去了。

四种填充风格该怎么选?

实心最保险,任何字号都认得出;灰度效果最好——它按笔画的浓淡映射成深浅不同的字符,抗锯齿的边缘天然带灰阶,出来最接近原字形,代价是字符种类多、粘到纯文本环境里有时会显得花;轮廓只画笔画的边,适合大字号,小字号下笔画本身就一格宽,画出来和实心没区别;反白是把背景填满、笔画留空,做成「墨底白字」的印章效果,行数调到 12 以上才看得清。

中文字体为什么有几款是灰的?

本机没装那款字体。 中文点阵是用系统字体把字画出来再采样的,所以能选什么取决于你电脑里装了什么:macOS 一般有苹方、宋体-简、楷体-简、圆体-简,Windows 一般有微软雅黑、宋体、楷体、仿宋,两边并不重合。工具在加载时逐款探测,没装的置灰而不是隐藏——藏起来的话,同一个页面在两台机器上选项数量不一样,反而让人以为是自己看花了眼。顺带一提,探测用的是拉丁字母样本:汉字在所有中文字体里都是全角等宽的,拿汉字去量宽度,任何字体都会被判成「没装」。

换个中文字体,效果差别真有那么大吗?

骨架完全不同。 黑体笔画等宽、转折方正,点阵化之后最清楚,字号小也认得出;宋体横细竖粗还带字脚(笔画末端的小三角),低分辨率下横画容易断掉,但字号一大就很有味道;楷体有提按和斜势,最像手写,也最挑行数;圆体端点是圆的,观感柔和;仿宋更瘦长,同样行数下占的列数少。一般建议:12 行以下用黑体,16 行以上再试宋体和楷体。

输出行数和输出宽度是什么关系?

宽度是行数推出来的,不能单独设。 中文点阵按「1 个字符格 = 1 像素宽 × 2 像素高」采样——因为终端里一个字符本身就是高约为宽两倍的长方形,采样块不按 1:2 走,字会被压扁。所以选 10 行,渲染时字号就是 20 像素,三个汉字大约 60 像素宽,也就是 60 列。要压窄只能减行数。

为什么建议控制在 80 列以内?

80 列是终端和代码块的传统宽度。 这个数字来自打孔卡,一直沿用到今天:大多数终端默认 80 列,GitHub 的代码块在常见屏宽下也差不多是这个量级。超过之后会折行,而字符画一旦折行就彻底散架,看不出原来是什么字。工具在超过 80 列时会提示,英文模式可以换「紧凑」字间距或更小的字体,中文模式把行数调小。

块字符(█ ▓ ░)为什么单独分了一组?

因为它们的显示宽度不确定。 这几个字符在 Unicode 里属于「东亚宽度歧义」类:在西文环境下占一格,在中文、日文、韩文环境的终端里可能占两格。同一份字符画,在你的编辑器里是对齐的,同事的终端里就歪了。观感确实比 @ # * 好,但要粘进代码注释、README 或者要发给别人看的场合,用纯 ASCII 的那七个更稳。「方块」那组字符梯度同理。