ldap-1-backend/public/tools/type.go

84 lines
2.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package tools
import (
"regexp"
"strings"
"unicode"
"github.com/mozillazg/go-pinyin"
)
// 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 {
if !unicode.Is(unicode.Han, r) {
return false
}
}
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 Convert(src string) string {
var dst string
if isChinese(src) { // 全是中文
return strings.Join(pinyin.LazyConvert(src, nil), "")
}
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)
}