github网址: https://github.com/mozillazg/go-pinyin
demo:
package pinyin
import (
"fmt"
"github.com/mozillazg/go-pinyin"
)
func Pinyin() {
hans := "中国人"
for _, r := range hans {
fmt.Println("r==", r)
fmt.Println("int(r)==", int(r))
fmt.Println("string(r)==", string(r))
}
// 默认
a := pinyin.NewArgs()
fmt.Println(pinyin.Pinyin(hans, a))
// [[zhong] [guo] [ren]]
// 包含声调
a.Style = pinyin.Tone
fmt.Println(pinyin.Pinyin(hans, a))
// [[zhōng] [guó] [rén]]
// 声调用数字表示
a.Style = pinyin.Tone2
fmt.Println(pinyin.Pinyin(hans, a))
// [[zho1ng] [guo2] [re2n]]
// 开启多音字模式
a = pinyin.NewArgs()
a.Heteronym = true
fmt.Println(pinyin.Pinyin(hans, a))
// [[zhong zhong] [guo] [ren]]
a.Style = pinyin.Tone2
fmt.Println(pinyin.Pinyin(hans, a))
// [[zho1ng zho4ng] [guo2] [re2n]]
fmt.Println(pinyin.LazyPinyin(hans, pinyin.NewArgs()))
// [zhong guo ren]
fmt.Println(pinyin.Convert(hans, nil))
// [[zhong] [guo] [ren]]
fmt.Println(pinyin.LazyConvert(hans, nil))
// [zhong guo ren]
}
源码简单分析:
Pinyin 函数:
// Pinyin 汉字转拼音,支持多音字模式.
func Pinyin(s string, a Args) [][]string {
pys := [][]string{}
for _, r := range s {
// r 是一个rune类型,(int32)
py := SinglePinyin(r, a)
if len(py) > 0 {
pys = append(pys, py)
}
}
return pys
}
SinglePinyin 函数:
// SinglePinyin 把单个 `rune` 类型的汉字转换为拼音.
func SinglePinyin(r rune, a Args) []string {
if a.Fallback == nil {
a.Fallback = Fallback
}
value, ok := PinyinDict[int(r)]
pys := []string{}
if ok {
pys = strings.Split(value, ",")
} else {
pys = a.Fallback(r, a)
}
if len(pys) > 0 {
if !a.Heteronym {
pys = []string{pys[0]}
}
return applyStyle(pys, a)
}
return pys
}
Fallback 没有拼音的字符自己返回空,即忽略
// Fallback 默认配置: 如何处理没有拼音的字符(忽略这个字符)
var Fallback = func(r rune, a Args) []string {
return []string{}
}
PinyinDict 是一个map[int]string 结构的字典,里面保存的是: "十六进制:pinyin". 这里不清楚为啥不直接用十进制呢。
// PinyinDict is data map
// Warning: Auto-generated file, don't edit.
var PinyinDict = map[int]string{
0x3007: "líng,yuán,xīng",
0x3400: "qiū",
0x3401: "tiàn",
0x3404: "kuà",
0x3405: "wǔ",
0x3406: "yǐn",
0x340C: "yí",
......
}
applyStyle :这个函数就是采用什么风格, 如声母,声标。。等一些风格,若想了解,自行参考代码,就200多行。