Skip to content

Commit 90e6f5c

Browse files
authored
🐡 feat: 处理拼音转换的问题 (#106)
1 parent 12aa33e commit 90e6f5c

File tree

1 file changed

+10
-80
lines changed

1 file changed

+10
-80
lines changed

public/tools/type.go

Lines changed: 10 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,90 +1,20 @@
11
package tools
22

3-
import (
4-
"regexp"
5-
"strings"
6-
"unicode"
7-
8-
"github.com/mozillazg/go-pinyin"
9-
)
3+
import "github.com/mozillazg/go-pinyin"
104

115
// H is a shortcut for map[string]interface{}
126
type H map[string]interface{}
137

14-
// 是否全为英文
15-
func isEnglish(str string) bool {
16-
match, _ := regexp.MatchString(`^[A-Za-z]+$`, str)
17-
return match
18-
}
19-
20-
// 是否为英文与数字组合
21-
func isEnglishAndNum(str string) bool {
22-
match, _ := regexp.MatchString(`^[a-zA-Z0-9_-]+$`, str)
23-
return match
24-
}
25-
26-
// 是否全为中文
27-
func isChinese(s string) bool {
28-
for _, r := range s {
29-
if !unicode.Is(unicode.Han, r) {
30-
return false
31-
}
32-
}
33-
return true
34-
}
35-
36-
/*
37-
由于名称的各种组合情况都有,在转换成拼音时也遇到各种各样的问题。这里做一下简单说明,以后将不再处理类似兼容问题,目前兼容如下情况。
38-
1.如果名字中有横杠或者下划线连接,将会删去下划线再处理
39-
2.全是中文:直接转拼音
40-
3.全是英文:不进行处理,原文呈现
41-
4.英文与数字组合,不进行处理,原文呈现
42-
5.如果是中英混合,那么分以下几种情况
43-
1.开头是中文,结尾不是中文:进入Convert逻辑第一种
44-
2.开头不是中文,结尾不是中文:进入Convert逻辑第一种
45-
3.开头不是中文,结尾是中文:进入Convert逻辑第三种
46-
47-
如再有其他情况,将不再进行兼容处理!!!
48-
*/
49-
50-
func ConvertToPinYin(src string) string {
51-
if strings.Contains(src, "-") {
52-
src = strings.ReplaceAll(src, "-", "")
53-
}
54-
if strings.Contains(src, "_") {
55-
src = strings.ReplaceAll(src, "_", "")
56-
}
57-
return Convert(src)
58-
}
59-
60-
// 将中文内容转成拼音
61-
func Convert(src string) string {
62-
var dst string
63-
if isChinese(src) { // 全是中文
64-
return strings.Join(pinyin.LazyConvert(src, nil), "")
65-
}
66-
if isEnglish(src) || isEnglishAndNum(src) { // 全是英文,或者为英文与数字组合
67-
return src
68-
}
69-
70-
han := regexp.MustCompile("([\u4e00-\u9fa5]+)")
71-
srcIndex := han.FindAllStringIndex(src, -1)
72-
73-
if srcIndex[0][0] == 0 { // 开头是中文
74-
dst = strings.ReplaceAll(src, src[srcIndex[0][0]:srcIndex[0][1]], strings.Join(pinyin.LazyConvert(src[srcIndex[0][0]:srcIndex[0][1]], nil), "")+"-")
75-
}
76-
if srcIndex[0][0] > 0 && srcIndex[0][1] < len(src) { // 中间是中文
77-
dst = strings.ReplaceAll(src, src[srcIndex[0][0]:srcIndex[0][1]], "-"+strings.Join(pinyin.LazyConvert(src[srcIndex[0][0]:srcIndex[0][1]], nil), "")+"-")
78-
}
79-
80-
if srcIndex[0][1] == len(src) { // 结尾是中文
81-
dst = strings.ReplaceAll(src, src[srcIndex[0][0]:srcIndex[0][1]], "-"+strings.Join(pinyin.LazyConvert(src[srcIndex[0][0]:srcIndex[0][1]], nil), ""))
8+
func ConvertToPinYin(src string) (dst string) {
9+
args := pinyin.NewArgs()
10+
args.Fallback = func(r rune, args pinyin.Args) []string {
11+
return []string{string(r)}
8212
}
8313

84-
dstIndex := han.FindAllStringIndex(dst, -1)
85-
if len(dstIndex) == 0 {
86-
return dst
14+
for _, singleResult := range pinyin.Pinyin(src, args) {
15+
for _, result := range singleResult {
16+
dst = dst + result
17+
}
8718
}
88-
89-
return Convert(dst)
19+
return
9020
}

0 commit comments

Comments
 (0)