使用 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 非常适合做 汉字数据工具脚本
  • 后端只负责存储,前端负责交互与动画
相关推荐
hoLzwEge4 分钟前
Volta实战:项目级Node版本管理 + 自定义安装目录
前端框架·node.js
laowang3573 小时前
依赖故障时,日志体系需要埋哪些关键节点才能快速定位是安装失败、解析失败还是运行时缺失?
前端·javascript·vue.js·webpack·node.js
不正经开发者8 小时前
Node.js process
node.js
志尊宝8 小时前
Vue3 环境搭建 + 第一个 HelloVue 项目(零基础入门)
vue.js·node.js·vue·css3
张一根1 天前
ESP32+Mqtt+Node.js+Vue3 做工控界面
node.js
TE-茶叶蛋1 天前
Node.js-Phase 1 学习总结:CLI 文件管理系统
学习·node.js
前端之虎陈随易2 天前
编程语言级别的Skill市场,AI Agent 的未来形态
前端·vue.js·人工智能·typescript·node.js
meilindehuzi_a2 天前
从零开始:用原生 Node.js 徒手拆解 RAG 与向量检索底层原理
node.js·rag
炒毛豆2 天前
ai全栈-node.js相关的学习之路(草稿版)
学习·node.js
meilindehuzi_a2 天前
解密 MCP 协议:如何用 Node.js 从零手写一个本地文件读取 MCP 服务器
运维·服务器·node.js