• Stars
    star
    7,048
  • Rank 5,536 (Top 0.2 %)
  • Language
    JavaScript
  • Created over 14 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

🇨🇳 汉字拼音 ➜ hàn zì pīn yīn

pīnyīn (v3)

pīnyīn, 汉字拼音转换工具。


NPM version Build Status Coverage Status Language Grade: JavaScript NPM downloads

Web Site: 简体中文 | English | 한국어

README: 简体中文 | English | 한국어

转换中文字符为拼音。可以用于汉字注音、排序、检索。

注:这个版本同时支持在 Node 和 Web 浏览器环境运行,

Python 版请关注 mozillazg/python-pinyin


特性

  • 根据词组智能匹配最正确的拼音。
  • 支持多音字。
  • 简单的繁体支持。
  • 支持多种不同拼音风格。

安装

via npm:

npm install pinyin@alpha --save

用法

开发者:

import pinyin from "pinyin";

console.log(pinyin("中心"));    // [ [ 'zhōng' ], [ 'xīn' ] ]

console.log(pinyin("中心", {
  heteronym: true,              // 启用多音字模式
}));                            // [ [ 'zhōng', 'zhòng' ], [ 'xīn' ] ]

console.log(pinyin("中心", {
  heteronym: true,              // 启用多音字模式
  segment: true,                // 启用分词,以解决多音字问题。默认不开启,使用 true 开启使用 nodejieba 分词库。
}));                            // [ [ 'zhōng' ], [ 'xīn' ] ]

console.log(pinyin("中心", {
  segment: "@node-rs/jieba",    // 指定分词库,可以是 "nodejieba"、"segmentit"、"@node-rs/jieba"。
}));                            // [ [ 'zhōng' ], [ 'xīn' ] ]

console.log(pinyin("我喜欢你", {
  segment: "segmentit",         // 启用分词
  group: true,                  // 启用词组
}));                            // [ [ 'wǒ' ], [ 'xǐhuān' ], [ 'nǐ' ] ]

console.log(pinyin("中心", {
  style: "initials",            // 设置拼音风格。
  heteronym: true,              // 即使有多音字,因为拼音风格选择,重复的也会合并。
}));                            // [ [ 'zh' ], [ 'x' ] ]

console.log(pinyin("华夫人", {
  mode: "surname",              // 姓名模式。
}));                            // [ ['huà'], ['fū'], ['rén'] ]

命令行:

$ pinyin 中心
zhōng xīn
$ pinyin -h

类型

IPinyinOptions

传入给 pinyin 方法的第二个参数的选项类型。

export interface IPinyinOptions {
  style?: IPinyinStyle; // 拼音输出形式
  mode?: IPinyinMode, // 拼音模式
  // 指定分词库。
  // 为了兼容老版本,可以使用 boolean 类型指定是否开启分词,默认开启。
  segment?: IPinyinSegment | boolean;
  // 是否返回多音字
  heteronym?: boolean;
  // 是否分组词组拼音
  group?: boolean;
  compact?: boolean;
}

IPinyinStyle

输出拼音格式。可以从直接使用以下字符串或数字,也兼容 v2 版本中 pinyin.STYLE_TONE 这样的形式。

export type IPinyinStyle =
  "normal" | "tone" | "tone2" | "to3ne" | "initials" | "first_letter" | // 推荐使用小写,和输出的拼音一致
  "NORMAL" | "TONE" | "TONE2" | "TO3NE" | "INITIALS" | "FIRST_LETTER" | // 方便老版本迁移
  0        | 1      | 2       | 5       | 3          | 4;               // 兼容老版本

IPinyinMode

拼音模式,默认普通模式,可以指定人名模式。

// - NORMAL: 普通模式
// - SURNAME: 姓氏模式,优先使用姓氏的拼音。
export type IPinyinMode =
  "normal" | "surname" |
  "NORMAL" | "SURNAME";

IPinyinSegment

分词方式。

  • 默认关闭 false
  • 也可以设置为 true 开启,Web 版中使用 "segmentit" 分词,Node 版中使用 "nodejieba" 分词。
  • 也可以声明以下字符串来指定分词算法。但目前 Web 版只支持 "segmentit" 分词。
export type IPinyinSegment = "nodejieba" | "segmentit" | "@node-rs/jieba";

API

方法 <Array> pinyin(words: string[, options: IPinyinOptions])

将传入的中文字符串 (words) 转换成拼音符号串。

options 是可选的,可以设定拼音风格,或打开多音字选项。

返回二维数组,第一维每个数组项位置对应每个中文字符串位置。 第二维是各个汉字的读音列表,多音字会有多个拼音项。

方法 Number compare(a, b)

按拼音排序的默认算法。

方法 string[][] compact(pinyinResult array[][])

将拼音多音字以各种可能的组合排列变换成紧凑形式。参考 options.compact

参数

<Boolean|IPinyinSegment> options.segment

是否启用分词模式,中文分词有助于极大的降低多音字问题。 但性能会极大的下降,内存也会使用更多。

  • 默认不启用分词。
  • 如果 segemnt = true,默认使用 nodejieba 分词。
  • 可以指定 "nodejieba"、"segmentit"、"@node-rs/jieba" 进行分词。

<Boolean> options.heteronym

是否启用多音字模式,默认关闭。

关闭多音字模式时,返回每个汉字第一个匹配的拼音。

启用多音字模式时,返回多音字的所有拼音列表。

<Boolean> options.group

按词组分组拼音,例如:

我喜欢你
wǒ xǐhuān nǐ

<IPinyinStyle> options.style

指定拼音风格。可以使用以下特定字符串或数值指定:

IPinyinStyle =
  "normal" | "tone" | "tone2" | "to3ne" | "initials" | "first_letter" | // 推荐使用小写,和输出的拼音一致
  "NORMAL" | "TONE" | "TONE2" | "TO3NE" | "INITIALS" | "FIRST_LETTER" | // 方便老版本迁移
  0        | 1      | 2       | 5       | 3          | 4;               // 兼容老版本

NORMAL, normal

普通风格,即不带声调。

如:pin yin

TONE, tone

声调风格,拼音声调在韵母第一个字母上。

注:这是默认的风格。

如:pīn yīn

TONE2, tone2

声调风格 2,即拼音声调以数字形式在各个拼音之后,用数字 [0-4] 进行表示。

如:pin1 yin1

TO3NE, to3ne

声调风格 3,即拼音声调以数字形式在注音字符之后,用数字 [0-4] 进行表示。

如:pi1n yi1n

INITIALS, initials

声母风格,只返回各个拼音的声母部分。对于没有声母的汉字,返回空白字符串。

如:中国 的拼音 zh g

注:声明风格会区分 zhzchcshs

注意:部分汉字没有声母,如 饿 等,另外 y, w, yu 都不是声母, 这些汉字的拼音声母风格会返回 ""。请仔细考虑你的需求是否应该使用首字母风格。 详情请参考 [为什么没有 y, w, yu 几个声母](#为什么没有 -y-w-yu- 几个声母)

FIRST_LETTER, first_letter

首字母风格,只返回拼音的首字母部分。

如:p y

options.mode

拼音模式,默认 "NORMAL" 普通模式。 如果你明确的在姓名场景下,可以使用 "SURNAME" 让姓氏使用更准确的拼音。

  • NORMAL:普通模式,自动识别读音。
  • SURNAME:姓名模式,对于明确的姓名场景,可以更准确的识别姓氏的读音。

options.compact

是否返回紧凑模式,默认 false,按标准格式返回。 如果设置为 true,则将多音字可能的各种组合排列后返回。例如:

pinyin("你好吗", { compact:false });
> [[nǐ], [hǎo,hào], [ma,má,mǎ]]

pinyin("你好吗", { compact:true });
> [
>   [nǐ,hǎo,ma], [nǐ,hǎo,má], [nǐ,hǎo,mǎ],
>   [nǐ,hào,ma], [nǐ,hào,má], [nǐ,hào,mǎ],
> ]

你也可以必要时使用 compact() 函数处理 pinyin(han, {compact:false}) 返回的结果。

Test

npm test

Q&A

关于 Web 版如何使用

首先,我建议大家应该优先考虑在服务端一次性转换拼音并将结果持久化,避免在客户端每次转换损耗性能和体验。

如果你坚持在客户端使用,你可以考虑使用 Webpack + Babel 来转换成低端浏览器的可执行代码。

实在不想折腾,可以试试 https://github.com/hotoo/pinyin/tree/gh-pages/dist

为什么没有 y, w, yu 几个声母?

声母风格(INITIALS)下,“雨”、“我”、“圆”等汉字返回空字符串,因为根据《汉语拼音方案》, ywü (yu) 都不是声母,在某些特定韵母无声母时,才加上 yw,而 ü 也有其特定规则。

如果你觉得这个给你带来了麻烦,那么也请小心一些无声母的汉字(如“啊”、“饿”、“按”、“昂”等)。 这时候你也许需要的是首字母风格(FIRST_LETTER)。

如何实现按拼音排序?

pinyin 模块提供了默认的排序方案:

const pinyin = require('pinyin');

const data = '我要排序'.split('');
const sortedData = data.sort(pinyin.compare);

如果默认的比较方法不能满足你的需求,你可以自定义 pinyinCompare 方法:

const pinyin = require('pinyin');

const data = '我要排序'.split('');

// 建议将汉字的拼音持久化存储起来。
const pinyinData = data.map(han => ({
  han: han,
  pinyin: pinyin(han)[0][0], // 可以自行选择不同的生成拼音方案和风格。
}));
const sortedData = pinyinData.sort((a, b) => {
  return a.pinyin.localeCompare(b.pinyin);
}).map(d => d.han);

node 版和 web 版有什么异同?

pinyin 目前可以同时运行在 Node 服务器端和 Web 浏览器端。 API 和使用方式完成一致。

但 Web 版较 Node 版稍简单,拼音库只有常用字部分,没有使用分词算法, 并且考虑了网络传输对词库进行了压缩处理。

由于分词和繁体中文的特性,部分情况下的结果也不尽相同。

特性 Web 版 Node 版
拼音库 常用字库。压缩、合并 完整字库。不压缩、合并
分词 没有分词 使用分词算法,多音字拼音更准确。
拼音频度排序 有根据拼音使用频度优先级排序。 同 Web 版。
繁体中文 没有繁体中文支持。 有简单的繁简汉字转换。

由于这些区别,测试不同运行环境的用例也不尽相同。

捐赠

如果这个模块有帮助到您,请 Star 这个仓库。

你也可以选择使用支付宝或微信给我捐赠:

Alipay:hotoo.cn@gmail.com, WeChat:hotoome

许可证

MIT

More Repositories

1

detector

🐶 客户端环境识别模块。(UserAgent detector)
JavaScript
884
star
2

pangu.vim

『盘古之白』中文排版自动规范化的 Vim 插件
Vim Script
328
star
3

markline

Ⓜ️ Timeline via Markdown.
JavaScript
162
star
4

nong

中国农历 (Nong Li)
JavaScript
129
star
5

rime

闲耘的 rime 输入法配置
Makefile
98
star
6

gitlab-notifications

👍 Notifications Center for GitLab
58
star
7

gitplus

🔀 git+ is a hack of git, smart for you.
JavaScript
57
star
8

gitopen

🔀 Open git/hg/svn remote url via web browser from terminal.
JavaScript
43
star
9

obsidian-markline

Markline: Markdown timeline view in Obsidian.
TypeScript
24
star
10

unistring

Unicode String for JavaScript
TypeScript
23
star
11

template.vim

Smart load template for Vim.
Vim Script
18
star
12

rm-trash

rm-trash is utility for safely remove files in Termail.app of macOS.
Shell
18
star
13

hongbao

叫花不理红包
18
star
14

vim-desktop-calendar

Printable Vim desktop Calendar 2024
17
star
15

versioning

Semantic Versioning Number Compare
JavaScript
14
star
16

lcal

lcal: 农历事件自动生成器 (Lunar Calender)
JavaScript
12
star
17

jsgf.vim

Improved `gf` for JavaScript, TypeScript and package.json.
Vim Script
11
star
18

hotoo.github.io

HTML
11
star
19

vimlide

Vimlide: Vim-like HTML(5) Slide.
JavaScript
10
star
20

chrommon.js

A Module Loader for Google Chrome Extensions.
JavaScript
9
star
21

url

Uniform Resource Locator.
JavaScript
9
star
22

Vimmer

Vim user contact list.
8
star
23

star

Star
JavaScript
7
star
24

vimwiki-to-markdown

Convert Vimwiki to Markdown
JavaScript
7
star
25

apassword

移动端密码控件
JavaScript
7
star
26

spm-build-deps

Build project all deps
JavaScript
7
star
27

jstidy

Javascript tidy (Lexical analysis, Syntax Analysis, Semantic Analysis, Formatter, Compression, Outline view)
C++
7
star
28

kissy-editor

KISSY Rich-Text Editor
JavaScript
6
star
29

vimkey

Vim-like key mapping
JavaScript
6
star
30

Edit-with-Vim-tabs

Edit with Vim tabs
6
star
31

perf-javascript-error

Performance test for JavaScript Error.
JavaScript
5
star
32

jobs

🐜 蚂蚁集团・数字金融技术部招聘
5
star
33

markdown.vim

5
star
34

rhythmaware

节奏感知器:根据用户的输入速度自动感知停顿状态。
JavaScript
5
star
35

eggjs-gf.vim

goto file for eggjs( support router, controllers, services, proxy, enums)
Vim Script
4
star
36

round-percent

Round Percent Widget
JavaScript
4
star
37

BaiduIndexAPI.java

第三方百度指数 API (Java版)
Java
4
star
38

js2json

Convert JavaScript Object to JSON format.
JavaScript
4
star
39

smartree

Smart Tree
JavaScript
4
star
40

blog

 · 闲耘™・博客
JavaScript
3
star
41

jsonmatter

JSON formatter tool by stream.
JavaScript
3
star
42

orderby

SQL like sort function.
JavaScript
3
star
43

blacklint

Check certain words.
Shell
3
star
44

highlight-cursor-word.vim

Highlight words which under text-cursor(caret) for Vim.
Vim Script
3
star
45

echo

Echo for Web UI, a replicator.
JavaScript
3
star
46

life

@hotoo's life line. A sample for use [markline](https://github.com/hotoo/markline).
Makefile
3
star
47

hundun

盘古之白,浑沌之初。
JavaScript
3
star
48

csspretty.vim

Vim Script
3
star
49

gitruth

Clean Git Files Forever.
Shell
3
star
50

firebug-lite-ie

Firebug Lite for IE.
3
star
51

chinese-lunar-calendar

中国农历
3
star
52

gaegtalk

基于gae和gtalk群聊服务
Python
2
star
53

Jumsoft-Money-zh_CN.lproj

Jumsoft Money 简体中文语言包。
2
star
54

Doit.vim

Vim plugin for Doit.im
2
star
55

fastclone

The fast clone way
JavaScript
2
star
56

linkage

无限级联动
JavaScript
2
star
57

seajs-gettext

GNU `gettext` like for seajs.
JavaScript
2
star
58

hotoo

1
star
59

scripts

很久之前在 Google Code 上备份的代码
JavaScript
1
star
60

.gitblacklist

Check and Reject certain words commit into git repository.
Shell
1
star
61

Chronos

Sync Server and Client Time by Javascript.
JavaScript
1
star
62

pasteboard

批量粘贴通用解决方案。
JavaScript
1
star
63

BaiduIndexAPI.php

第三方百度指数 API (PHP版)
1
star
64

imagic

Imagic send data by image, for tests mock.
JavaScript
1
star
65

samoyed

The samoyed life timeline who named Summer.
Makefile
1
star
66

open-basketball-court

开放篮球场地标工程
1
star
67

jquery.mousepause.js

Add mousepause event for jQuery (trigger when mouse move stoped).
JavaScript
1
star
68

jquery.editable.js

JavaScript
1
star
69

spm-xgettext

GUN xgettext-like for spm.
JavaScript
1
star
70

family-tree-builder-zh_cn

Family Tree Builder 简体中文语言包
1
star
71

tabbar

TabBar
JavaScript
1
star
72

jquery.checkallable.js

支持Checkbox 和 Radio,及 shiftKey 多选功能。
JavaScript
1
star
73

twitter

@hotoo tweets page.
JavaScript
1
star
74

.n-completion

n completion
1
star
75

repeatable

之前写的『可重复新增』模块,后来写了全新的 Echo,这个模块闲置没管,因为换电脑先备份在这。
JavaScript
1
star
76

Snotra

Vim-like WYSIWYG Web Editor
1
star
77

jsbc

JavaScript code Batch Compiler
JavaScript
1
star