diff --git a/utils/utils.go b/utils/utils.go index 99e81c2b..4e896e6c 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -370,45 +370,26 @@ func LimitMixedStringLen(str string, maxByteCount int) (limitedStr string) { // 限制的是字符数,不是字节数 func LimitUTF8StringLen2(str string, maxRuneCount int) (limitedStr string) { - str2 := "" - bs := []byte(str) - bl := 0 + if maxRuneCount > 0 { + if len(str) > maxRuneCount { + runeList := []rune(str) + if len(runeList) > maxRuneCount { + str = string(runeList[:maxRuneCount]) + } + } + } + limitedStr = loop([]byte(str)) + return limitedStr +} + +func loop(bs []byte) (result string) { for i := len(bs) - 1; i >= 0; i-- { - switch { - case bs[i] >= 0 && bs[i] <= 127 && bs[i] != 42 && bs[i] != 40 && bs[i] != 41: + if bs[i] == 0 { bs2 := bs[:i] bs3 := bs[i+1:] bs4 := [][]byte{bs2, bs3} - return string(bytes.Join(bs4, []byte(""))) - case bs[i] >= 128 && bs[i] <= 191: - bl++ - case bs[i] >= 192 && bs[i] <= 253: - cl := 0 - switch { - case bs[i]&252 == 252: - cl = 6 - case bs[i]&248 == 248: - cl = 5 - case bs[i]&240 == 240: - cl = 4 - case bs[i]&224 == 224: - cl = 3 - default: - cl = 2 - } - if bl+1 == cl { - str2 = string(bs[:i+cl]) - } - str2 = string(bs[:i]) + return loop(bytes.Join(bs4, []byte(""))) } } - if maxRuneCount > 0 { - if len(str2) > maxRuneCount { - runeList := []rune(str2) - if len(runeList) > maxRuneCount { - str2 = string(runeList[:maxRuneCount]) - } - } - } - return str2 + return string(bs) }