使用 cnchar 生成汉字拼音、笔画、组词数据(Node.js 实战教程)

一、使用场景

在汉字学习、识字类项目中,通常需要提前生成:

  • 汉字
  • 拼音(带声调)
  • 笔画数
  • 笔画类型(横竖撇捺等)
  • 常见组词

本文使用 Node.js + cnchar 生成 JSON 数据,供后端直接导入数据库使用。


二、安装依赖

bash 复制代码
npm install cnchar cnchar-order cnchar-poly cnchar-words cnchar-voice

三、生成脚本

generate_char_data1.js

js 复制代码
// generate_char_data_for_execjs.js
// Node ESM / execjs / cnchar
// 生成:拼音 / 笔画数 / 笔画名 / 原始笔画数据

import cnchar from 'cnchar';
import order from 'cnchar-order';
import poly from 'cnchar-poly';
import words from 'cnchar-words';
import voice from 'cnchar-voice';
import fs from 'fs';

// =======================
// 1️ 注册插件
// =======================
cnchar.use(order, poly, words, voice);
// =======================
// 2️ 获取单字数据
// =======================
function getCharacterData(char) {
  try {
    // 拼音
    const spell = cnchar.spell(char, 'tone');
    const pinyin = Array.isArray(spell) ? spell.join(' / ') : spell || '';

    // 笔画数
    const strokeCount = cnchar.stroke(char) || 1;

    // 笔画名称(标准)
    const strokeNameList = cnchar.stroke(char, 'order', 'name');
    const strokeNames = Array.isArray(strokeNameList)
      ? strokeNameList.join(',')
      : '';

    // ⭐ 原始笔画(detail 模式)
    const strokeDetailList = cnchar.stroke(char, 'order', 'detail');
    const strokesRaw = cnchar.stroke(char, 'order', 'shape')

    // 组词
    const wordList = cnchar.words(char);
    const wordsStr = Array.isArray(wordList)
      ? wordList.slice(0, 8).join(',')
      : '';

    return {
      character: char,
      pinyin,
      stroke_count: strokeCount,
      stroke_names: strokeNames,
      strokes_raw: strokesRaw,   // 新增字段
      words: wordsStr
    };
  } catch (err) {
    return {
      character: char,
      pinyin: '',
      stroke_count: 1,
      stroke_names: '',
      strokes_raw: [],
      words: ''
    };
  }
}

// =======================
// 3️Node 直接运行示例
// =======================
if (process.argv[1] && process.argv[1].includes('generate_char_data')) {
  const chars = ['一', '人', '好', '学', '你', '我'];

  const data = chars.map(getCharacterData);

  fs.writeFileSync(
    './char_data.json',
    JSON.stringify(
      {
        generated_at: new Date().toISOString(),
        total: data.length,
        characters: data
      },
      null,
      2
    ),
    'utf-8'
  );

  console.log(' 已生成 char_data.json(含原始笔画)');
}

// =======================
// 4️ execjs 导出
// =======================
export { getCharacterData };

四、运行脚本

bash 复制代码
node generate_char_data1.js

生成文件:

txt 复制代码
generated_characters.json

五、生成结果示例

json 复制代码
{
  "generated_at": "2025-12-27T02:47:57.131Z",
  "total": 6,
  "characters": [
    {
      "character": "一",
      "pinyin": "Yī",
      "stroke_count": 1,
      "stroke_names": "横",
      "strokes_raw": [
        [
          "一"
        ]
      ],
      "words": "八一,八一队,不一,不一定,创一流,初一,单一,第一"
    },
    {
      "character": "人",
      "pinyin": "Rén",
      "stroke_count": 2,
      "stroke_names": "撇,捺",
      "strokes_raw": [
        [
          "丿",
          "㇏"
        ]
      ],
      "words": "爱人,爱人民,保护人,被告人,北京人,本人,辩护人,别人"
    },
    {
      "character": "好",
      "pinyin": "Hǎo",
      "stroke_count": 6,
      "stroke_names": "撇点,撇,横,横撇|横钩,竖钩,横",
      "strokes_raw": [
        [
          "𡿨",
          "丿",
          "一",
          "㇇|乛",
          "亅",
          "一"
        ]
      ],
      "words": "爱好,爱好者,办好,备好,变好,不好,大好,打好"
    },
    {
      "character": "学",
      "pinyin": "Xué",
      "stroke_count": 8,
      "stroke_names": "点,点,撇,点2,横撇|横钩,横撇|横钩,竖钩,横",
      "strokes_raw": [
        [
          "丶",
          "丶",
          "丿",
          "㇀",
          "㇇|乛",
          "㇇|乛",
          "亅",
          "一"
        ]
      ],
      "words": "爱科学,爱学习,办学,博学,不科学,才学,辍学,初学"
    },
    {
      "character": "你",
      "pinyin": "Nǐ",
      "stroke_count": 7,
      "stroke_names": "撇,竖,撇,横撇|横钩,竖钩,撇,点",
      "strokes_raw": [
        [
          "丿",
          "丨",
          "丿",
          "㇇|乛",
          "亅",
          "丿",
          "丶"
        ]
      ],
      "words": "你的,你好,迷你,你们,你我"
    },
    {
      "character": "我",
      "pinyin": "Wǒ",
      "stroke_count": 7,
      "stroke_names": "撇,横,竖钩,提,斜钩|卧钩,撇,点",
      "strokes_raw": [
        [
          "丿",
          "一",
          "亅",
          "㇀",
          "㇂|㇃",
          "丿",
          "丶"
        ]
      ],
      "words": "你我,忘我,我厂,我处,我方,我国,我局,我军"
    }
  ]
}

六、注意事项(重要)

  • stroke_count 可靠
  • stroke_names 仅用于基础展示
  • 教学级笔顺 / 动画 建议前端使用 HanziWriter
  • 不推荐在 Django / Java 中直接计算笔画

七、总结

  • cnchar 适合 数据预生成
  • Node.js 非常适合做 汉字数据工具脚本
  • 后端只负责存储,前端负责交互与动画
相关推荐
想学后端的前端工程师2 小时前
【Node.js后端开发实战指南:从入门到企业级应用】
node.js
weixin_462446232 小时前
Node.js 纯 JS 生成 SVG 练字纸(米字格 / 田字格)完整实现解析
开发语言·javascript·node.js
cypking2 小时前
三、NestJS 开发实战文档-->集成 MySQL(TypeORM)
前端·数据库·mysql·adb·node.js
Misnearch2 小时前
npm包-serve包使用
前端·npm·node.js
千寻girling13 小时前
计算机组成原理-全通关源码-实验(通关版)---头歌平台
前端·面试·职场和发展·typescript·node.js
damo王21 小时前
how to install npm in ubuntu24.04?
前端·npm·node.js
weixin_5316518121 小时前
Node.js 流操作
node.js·node·stream
Lupino1 天前
Node.js 与 Haskell 混合网络编程踩坑记:TCP 粘包与状态不一致引发的“死锁”
javascript·node.js
神秘的猪头1 天前
LangChain Tool 实战:让大模型“长出双手”,通过 Tool 调用连接真实世界
langchain·node.js·aigc