Node.js 使用 pinyin 汉字转拼音

5,093 阅读2分钟
使用 npm 安装 pinyin 包
npm install pinyin
测试数据,使用 pinyin 转换为拼音
const pinyin = require("pinyin");

/**
 * function pinyin(words: string, options?: pinyin.Options): string[][];
 *
 * @param words 汉字
 * @param options 可选参数设置
 *
 * @return string[][]
 */

let poetryAuthorList = ["汉乐府", "两汉乐府", "江景", ];

for (const poetryNameCn of poetryAuthorList) {
  let pinyinNames = pinyin(poetryNameCn);
  console.log(poetryNameCn, pinyinNames);
}

> node node pinyin_test.js
汉乐府 [ [ 'hàn' ], [ 'lè' ], [ 'fǔ' ] ]
两汉乐府 [ [ 'liǎng' ], [ 'hàn' ], [ 'lè' ], [ 'fǔ' ] ]
江景 [ [ 'jiāng' ], [ 'jǐng' ] ]
多音字设置
// heteronym
let pinyinNames = pinyin(poetryNameCn, { heteronym: true });

> node node pinyin_test.js
汉乐府 [ [ 'hàn' ], [ 'lè', 'yuè', 'yào', 'lào' ], [ 'fǔ' ] ]
两汉乐府 [ [ 'liǎng' ],[ 'hàn' ], [ 'lè', 'yuè', 'yào', 'lào' ], [ 'fǔ' ] ]
江景 [ [ 'jiāng' ], [ 'jǐng', 'yǐng' ] ]
转换拼音风格设置
// 可选参数 style, pinyin 几种风格设置。 

// STYLE_NORMAL 普通风格,即不带声调。 
let pinyinNames = pinyin(poetryNameCn, {style: pinyin.STYLE_NORMAL,});

> node node pinyin_test.js
汉乐府 [ [ 'han' ], [ 'le' ], [ 'fu' ] ]
两汉乐府 [ [ 'liang' ], [ 'han' ], [ 'le' ], [ 'fu' ] ]
江景 [ [ 'jiang' ], [ 'jing' ] ]

// STYLE_TONE 默认风格设置; 声调风格,拼音声调在韵母第一个字母上。
> node pinyin_test.js
汉乐府 [ [ 'hàn' ], [ 'lè' ], [ 'fǔ' ] ]
两汉乐府 [ [ 'liǎng' ], [ 'hàn' ], [ 'lè' ], [ 'fǔ' ] ]
江景 [ [ 'jiāng' ], [ 'jǐng' ] ]

// STYLE_TONE2 声调风格 2,即拼音声调以数字形式在各个拼音之后,用数字 [0-4] 进行表示。
> node pinyin_test.js
汉乐府 [ [ 'han4' ], [ 'le4' ], [ 'fu3' ] ]
两汉乐府 [ [ 'liang3' ], [ 'han4' ], [ 'le4' ], [ 'fu3' ] ]
江景 [ [ 'jiang1' ], [ 'jing3' ] ]

// STYLE_TO3NE 声调风格 3,即拼音声调以数字形式在注音字符之后,用数字 [0-4] 进行表示。
> node pinyin_test.js
汉乐府 [ [ 'ha4n' ], [ 'le4' ], [ 'fu3' ] ]
两汉乐府 [ [ 'lia3ng' ], [ 'ha4n' ], [ 'le4' ], [ 'fu3' ] ]
江景 [ [ 'jia1ng' ], [ 'ji3ng' ] ]

// STYLE_INITIALS 声母风格,只返回各个拼音的声母部分。对于没有声母的汉字,返回空白字符串。
// poetryauthorlist 加入 '中国'
> node pinyin_test.js
中国 [ [ 'zh' ], [ 'g' ] ]
汉乐府 [ [ 'h' ], [ 'l' ], [ 'f' ] ]
两汉乐府 [ [ 'l' ], [ 'h' ], [ 'l' ], [ 'f' ] ]
江景 [ [ 'j' ], [ 'j' ] ]

// STYLE_FIRST_LETTER 首字母风格,只返回拼音的首字母部分。
中国 [ [ 'z' ], [ 'g' ] ]
汉乐府 [ [ 'h' ], [ 'l' ], [ 'f' ] ]
两汉乐府 [ [ 'l' ], [ 'h' ], [ 'l' ], [ 'f' ] ]
江景 [ [ 'j' ], [ 'j' ] ]
提取转换后的拼音
for (const poetryNameCn of poetryAuthorList) {
  let pinyinNames = pinyin(poetryNameCn, {
    style: pinyin.STYLE_NORMAL,
  });
  // 数组扁平化
  console.log(poetryNameCn, pinyinNames.join(""));
}

> node pinyin_test.js
中国 zhongguo
汉乐府 hanlefu
两汉乐府 lianghanlefu
江景 jiangjing
扩展: [JS 数组扁平化]
// 栗子
[ [ 'liang' ], [ 'han' ], [ 'le' ], [ 'fu' ] ]  => [ 'liang', 'han', 'le', 'fu' ]
// 数组方法
pinyinNames.join(",").split(",")
// 数组方法 reduce,自定义函数
function flatten(arr) {
  return arr.reduce((result, item) => {
    return result.concat(Array.isArray(item) ? flatten(item) : item);
  }, []);
}

// 使用 flatten(pinyinNames)
// 模板字符串
`${pinyinNames}`.split(",")
// ES6 扩展语法
[].concat(...pinyinNames)