From ef652a366b0d01837fb7c815338dac87aded81e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8C=E4=B8=AB=E8=AE=B2=E6=A2=B5?= Date: Thu, 4 Aug 2022 16:20:07 +0800 Subject: [PATCH] =?UTF-8?q?=E2=98=84=EF=B8=8F=20feat:=20=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=E5=90=8D=E5=AD=97=E8=BD=AC=E4=B8=BA=E6=8B=BC=E9=9F=B3=E7=9A=84?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E6=80=A7=20(#103)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/tools/type.go | 66 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 59 insertions(+), 7 deletions(-) diff --git a/public/tools/type.go b/public/tools/type.go index 79ac165..f7bf430 100644 --- a/public/tools/type.go +++ b/public/tools/type.go @@ -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 } -// 将中文内容转成拼音 -func ConvertToPinYin(s string) (ret string) { - if isChinese(s) { - ret = strings.Join(pinyin.LazyConvert(s, nil), "") - } else { - ret = s +/* +由于名称的各种组合情况都有,在转换成拼音时也遇到各种各样的问题。这里做一下简单说明,以后将不再处理类似兼容问题,目前兼容如下情况。 + 1.如果名字中有横杠或者下划线连接,将会删去下划线再处理 + 2.全是中文:直接转拼音 + 3.全是英文:不进行处理,原文呈现 + 4.如果是中英混合,那么分以下几种情况 + 1.开头是中文,结尾不是中文:进入Convert逻辑第一种 + 2.开头不是中文,结尾不是中文:进入Convert逻辑第一种 + 3.开头不是中文,结尾是中文:进入Convert逻辑第三种 + + 如再有其他情况,将不再进行兼容处理!!! +*/ + +func ConvertToPinYin(src string) string { + if strings.Contains(src, "-") { + src = strings.ReplaceAll(src, "-", "") } - return + 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) }