go-中文转拼音

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多行。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容