You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
1.5 KiB
90 lines
1.5 KiB
package util
|
|
|
|
import (
|
|
"bytes"
|
|
"strings"
|
|
"unicode"
|
|
|
|
"github.com/mozillazg/go-pinyin"
|
|
)
|
|
|
|
func PinyinFirstLetterUpper(hans string) string {
|
|
if hans == "" {
|
|
return ""
|
|
}
|
|
|
|
py := getPinyin(hans)
|
|
return processPolyphones(hans, py)
|
|
}
|
|
|
|
func getPinyin(hans string) string {
|
|
a := pinyin.NewArgs()
|
|
a.Style = pinyin.FIRST_LETTER
|
|
a.Heteronym = true
|
|
|
|
pys := pinyin.Pinyin(hans, a)
|
|
|
|
var buffer bytes.Buffer
|
|
|
|
for _, py := range pys {
|
|
buffer.WriteString(strings.ToUpper(py[0]))
|
|
}
|
|
|
|
return buffer.String()
|
|
}
|
|
|
|
var polyphoneDict = map[string][2]rune{
|
|
"阿": [2]rune{'A', 'E'},
|
|
"参": [2]rune{'C', 'S'},
|
|
"长": [2]rune{'C', 'Z'},
|
|
"术": [2]rune{'S', 'Z'},
|
|
}
|
|
|
|
// 处理多音字,目前只支持一个汉字两个多音字的处理
|
|
func processPolyphones(src, py string) string {
|
|
srcRune := []rune(src)
|
|
keywordIndex := map[int][2]rune{}
|
|
|
|
for i, r := range srcRune {
|
|
if _, ok := polyphoneDict[string(r)]; ok {
|
|
keywordIndex[i] = polyphoneDict[string(r)]
|
|
}
|
|
}
|
|
|
|
if len(keywordIndex) == 0 {
|
|
return py
|
|
}
|
|
|
|
pyRune := []rune(py)
|
|
pyRuneReplaced := make([]rune, len(pyRune))
|
|
|
|
for i, r := range pyRune {
|
|
pyRuneReplaced[i] = r
|
|
|
|
if rs, ok := keywordIndex[i]; ok {
|
|
for _, pr := range rs {
|
|
if r != pr {
|
|
pyRuneReplaced[i] = pr
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if len(pyRuneReplaced) > 0 {
|
|
pyRune = append(pyRune, ',')
|
|
pyRune = append(pyRune, pyRuneReplaced...)
|
|
}
|
|
|
|
return string(pyRune)
|
|
}
|
|
|
|
//是否是字母字符串
|
|
func IsLetter(s string) bool {
|
|
for _, r := range s {
|
|
if !unicode.IsLetter(r) {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|