Skip to content

Commit ef652a3

Browse files
authored
☄️ feat: 增强名字转为拼音的兼容性 (#103)
1 parent 47341d1 commit ef652a3

File tree

1 file changed

+58
-6
lines changed

1 file changed

+58
-6
lines changed

public/tools/type.go

Lines changed: 58 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package tools
22

33
import (
4+
"regexp"
45
"strings"
56
"unicode"
67

@@ -10,6 +11,12 @@ import (
1011
// H is a shortcut for map[string]interface{}
1112
type H map[string]interface{}
1213

14+
// 是否全为英文
15+
func isEnglish(str string) bool {
16+
match, _ := regexp.MatchString(`^[A-Za-z]+$`, str)
17+
return match
18+
}
19+
1320
// 是否全为中文
1421
func isChinese(s string) bool {
1522
for _, r := range s {
@@ -20,12 +27,57 @@ func isChinese(s string) bool {
2027
return true
2128
}
2229

30+
/*
31+
由于名称的各种组合情况都有,在转换成拼音时也遇到各种各样的问题。这里做一下简单说明,以后将不再处理类似兼容问题,目前兼容如下情况。
32+
1.如果名字中有横杠或者下划线连接,将会删去下划线再处理
33+
2.全是中文:直接转拼音
34+
3.全是英文:不进行处理,原文呈现
35+
4.如果是中英混合,那么分以下几种情况
36+
1.开头是中文,结尾不是中文:进入Convert逻辑第一种
37+
2.开头不是中文,结尾不是中文:进入Convert逻辑第一种
38+
3.开头不是中文,结尾是中文:进入Convert逻辑第三种
39+
40+
如再有其他情况,将不再进行兼容处理!!!
41+
*/
42+
43+
func ConvertToPinYin(src string) string {
44+
if strings.Contains(src, "-") {
45+
src = strings.ReplaceAll(src, "-", "")
46+
}
47+
if strings.Contains(src, "_") {
48+
src = strings.ReplaceAll(src, "_", "")
49+
}
50+
return Convert(src)
51+
}
52+
2353
// 将中文内容转成拼音
24-
func ConvertToPinYin(s string) (ret string) {
25-
if isChinese(s) {
26-
ret = strings.Join(pinyin.LazyConvert(s, nil), "")
27-
} else {
28-
ret = s
54+
func Convert(src string) string {
55+
var dst string
56+
if isChinese(src) { // 全是中文
57+
return strings.Join(pinyin.LazyConvert(src, nil), "")
58+
}
59+
if isEnglish(src) { // 全是英文
60+
return src
2961
}
30-
return
62+
63+
han := regexp.MustCompile("([\u4e00-\u9fa5]+)")
64+
srcIndex := han.FindAllStringIndex(src, -1)
65+
66+
if srcIndex[0][0] == 0 { // 开头是中文
67+
dst = strings.ReplaceAll(src, src[srcIndex[0][0]:srcIndex[0][1]], strings.Join(pinyin.LazyConvert(src[srcIndex[0][0]:srcIndex[0][1]], nil), "")+"-")
68+
}
69+
if srcIndex[0][0] > 0 && srcIndex[0][1] < len(src) { // 中间是中文
70+
dst = strings.ReplaceAll(src, src[srcIndex[0][0]:srcIndex[0][1]], "-"+strings.Join(pinyin.LazyConvert(src[srcIndex[0][0]:srcIndex[0][1]], nil), "")+"-")
71+
}
72+
73+
if srcIndex[0][1] == len(src) { // 结尾是中文
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+
77+
dstIndex := han.FindAllStringIndex(dst, -1)
78+
if len(dstIndex) == 0 {
79+
return dst
80+
}
81+
82+
return Convert(dst)
3183
}

0 commit comments

Comments
 (0)