☄️ feat: 增强名字转为拼音的兼容性 (#103)

This commit is contained in:
二丫讲梵 2022-08-04 16:20:07 +08:00 committed by GitHub
parent 47341d108f
commit ef652a366b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 59 additions and 7 deletions

View File

@ -1,6 +1,7 @@
package tools
import (
"regexp"
"strings"
"unicode"
@ -10,6 +11,12 @@ import (
// H is a shortcut for map[string]interface{}
type H map[string]interface{}
// 是否全为英文
func isEnglish(str string) bool {
match, _ := regexp.MatchString(`^[A-Za-z]+$`, str)
return match
}
// 是否全为中文
func isChinese(s string) bool {
for _, r := range s {
@ -20,12 +27,57 @@ func isChinese(s string) bool {
return true
}
/*
由于名称的各种组合情况都有在转换成拼音时也遇到各种各样的问题这里做一下简单说明以后将不再处理类似兼容问题目前兼容如下情况
1.如果名字中有横杠或者下划线连接将会删去下划线再处理
2.全是中文直接转拼音
3.全是英文不进行处理原文呈现
4.如果是中英混合那么分以下几种情况
1.开头是中文结尾不是中文进入Convert逻辑第一种
2.开头不是中文结尾不是中文进入Convert逻辑第一种
3.开头不是中文结尾是中文进入Convert逻辑第三种
如再有其他情况将不再进行兼容处理
*/
func ConvertToPinYin(src string) string {
if strings.Contains(src, "-") {
src = strings.ReplaceAll(src, "-", "")
}
if strings.Contains(src, "_") {
src = strings.ReplaceAll(src, "_", "")
}
return Convert(src)
}
// 将中文内容转成拼音
func ConvertToPinYin(s string) (ret string) {
if isChinese(s) {
ret = strings.Join(pinyin.LazyConvert(s, nil), "")
} else {
ret = s
func Convert(src string) string {
var dst string
if isChinese(src) { // 全是中文
return strings.Join(pinyin.LazyConvert(src, nil), "")
}
return
if isEnglish(src) { // 全是英文
return src
}
han := regexp.MustCompile("([\u4e00-\u9fa5]+)")
srcIndex := han.FindAllStringIndex(src, -1)
if srcIndex[0][0] == 0 { // 开头是中文
dst = strings.ReplaceAll(src, src[srcIndex[0][0]:srcIndex[0][1]], strings.Join(pinyin.LazyConvert(src[srcIndex[0][0]:srcIndex[0][1]], nil), "")+"-")
}
if srcIndex[0][0] > 0 && srcIndex[0][1] < len(src) { // 中间是中文
dst = strings.ReplaceAll(src, src[srcIndex[0][0]:srcIndex[0][1]], "-"+strings.Join(pinyin.LazyConvert(src[srcIndex[0][0]:srcIndex[0][1]], nil), "")+"-")
}
if srcIndex[0][1] == len(src) { // 结尾是中文
dst = strings.ReplaceAll(src, src[srcIndex[0][0]:srcIndex[0][1]], "-"+strings.Join(pinyin.LazyConvert(src[srcIndex[0][0]:srcIndex[0][1]], nil), ""))
}
dstIndex := han.FindAllStringIndex(dst, -1)
if len(dstIndex) == 0 {
return dst
}
return Convert(dst)
}