字
字节笔记本
2026年2月22日
Make Me a Hanzi - 开源汉字数据与笔画动画项目
本文介绍 Make Me a Hanzi,一个免费开源的汉字数据项目,提供超过 9000 个常用简体和繁体汉字的字典数据和笔画顺序矢量图形。该项目是众多汉字学习应用和网站的数据基础,包括 Hanzi Writer、Inkstone 等知名工具。
项目简介
Make Me a Hanzi 是由 skishore 开发维护的开源项目,旨在为中文学习者提供高质量的汉字数据。截至目前,该项目在 GitHub 上已获得 2.4k+ stars 和 563+ forks。
该项目的数据来源于多个开放数据源,包括 Unicode Unihan 数据库、CJKlib 以及 Arphic Technology 提供的免费字体。项目采用双重许可证:字典数据采用更宽松的许可证,而图形数据采用 LGPL 许可证。
核心特性
- 海量汉字数据:覆盖 9000+ 个常用简体和繁体汉字
- 笔画顺序数据:提供每个汉字的标准笔画顺序 SVG 矢量图形
- 动画支持:包含实验性的动画 SVG 文件,可展示汉字书写过程
- 详细字典信息:包含拼音、释义、部首、字源等信息
- IDS 分解:支持表意文字描述序列(Ideograph Description Sequence)分解
- 免费开源:数据完全免费,可用于个人和商业项目
数据文件说明
项目数据分为两个主要文件:
dictionary.txt
包含字典信息,每条记录为 JSON 格式:
| 字段 | 说明 |
|---|---|
character | Unicode 字符(必需) |
definition | 面向第二语言学习者的释义(可选) |
pinyin | 逗号分隔的拼音列表(必需) |
decomposition | IDS 字符分解(必需) |
etymology | 字源信息,包含 type、hint、phonetic、semantic 等字段(可选) |
radical | 部首(必需) |
matches | 笔画与部件的映射关系(可选) |
graphics.txt
包含图形数据,每条记录为 JSON 格式:
| 字段 | 说明 |
|---|---|
character | Unicode 字符(必需) |
strokes | SVG 路径数据列表,按正确笔画顺序排列 |
medians | 笔画中线数据,可用于生成笔画顺序动画 |
坐标系统说明:
- 画布大小:1024×1024
- 左上角坐标:(0, 900)
- 右下角坐标:(1024, -124)
- 注意:Y 轴向下递减(与常规坐标系相反)
使用示例
基础 SVG 渲染
html
<svg viewBox="0 0 1024 1024">
<g transform="scale(1, -1) translate(0, -900)">
<path d="STROKE[0] DATA GOES HERE"></path>
<path d="STROKE[1] DATA GOES HERE"></path>
...
</g>
</svg>嵌入动画 SVG
项目提供实验性的动画 SVG 文件(位于 svgs/ 目录),可通过 Unicode 码点查找对应文件:
javascript
// 获取字符的 Unicode 码点
const codepoint = '字'.charCodeAt(0); // 23383html
<body>
<embed src="23383.svg" width="200px" height="200px"/>
</body>Node.js 读取数据
javascript
const fs = require('fs');
// 读取字典数据
const dictionary = fs.readFileSync('dictionary.txt', 'utf8')
.split('\n')
.filter(line => line.trim())
.map(line => JSON.parse(line));
// 读取图形数据
const graphics = fs.readFileSync('graphics.txt', 'utf8')
.split('\n')
.filter(line => line.trim())
.map(line => JSON.parse(line));
// 查找特定字符
const charData = dictionary.find(d => d.character === '汉');
const charGraphics = graphics.find(g => g.character === '汉');
console.log(charData);
// {
// character: '汉',
// definition: 'the Han Chinese people, Chinese language',
// pinyin: 'hàn',
// decomposition: '⿰氵又',
// radical: '氵',
// ...
// }数据来源与许可
dictionary.txt
- 来源:Unicode Unihan 数据库、CJKlib
- 许可证:较宽松的开源许可
graphics.txt 和 svgs.tar.gz
- 来源:Arphic PL KaitiM GB 和 Arphic PL UKai 字体
- 许可证:LGPL
特别感谢 Arphic Technology(文鼎科技)在 1999 年以宽松许可证发布其字体作品,使本项目成为可能。
相关项目
Make Me a Hanzi 的数据被广泛应用于以下项目:
| 项目 | 说明 | 链接 |
|---|---|---|
| Hanzi Writer | JavaScript 汉字动画和练习库 | GitHub |
| Inkstone | 中文书写练习应用 | 官网 |
| Zydeo | 免费开源中文词典 | 官网 |
| HanDeDict | 中德词典 | GitHub |
| Hanping Chinese Dictionary | Android 中文词典应用 | Google Play |
替代资源
如需其他地区的笔画顺序数据,可参考:
在线演示
在演示站中,你可以通过手写输入查找汉字,查看笔画顺序动画。
项目链接
分享: