From c2d160663c9c1b9fe78236564dfa0758ab70a5b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Fri, 13 Mar 2020 10:26:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8E=BB=E9=99=A4=E4=B9=B1?= =?UTF-8?q?=E7=A0=81=E7=9A=84=E9=95=BF=E5=BA=A6=E9=99=90=E5=88=B6=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/utils.go | 83 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 79 insertions(+), 4 deletions(-) diff --git a/utils/utils.go b/utils/utils.go index 5ed07c5d..99e81c2b 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -1,6 +1,7 @@ package utils import ( + "bytes" "encoding/base64" "net/http" "reflect" @@ -287,15 +288,44 @@ func LimitStringLen(str string, maxByteCount int) (limitedStr string) { // 限制的是字符数,不是字节数 func LimitUTF8StringLen(str string, maxRuneCount int) (limitedStr string) { + str2 := "" + bs := []byte(str) + bl := 0 + for i := len(bs) - 1; i >= 0; i-- { + switch { + case bs[i] >= 0 && bs[i] <= 127: + return string(bs[:i+1]) + 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]) + } + } if maxRuneCount > 0 { - if len(str) > maxRuneCount { - runeList := []rune(str) + if len(str2) > maxRuneCount { + runeList := []rune(str2) if len(runeList) > maxRuneCount { - str = string(runeList[:maxRuneCount]) + str2 = string(runeList[:maxRuneCount]) } } } - return str + return str2 } // 限制的是字节数,正常处理乱码 @@ -337,3 +367,48 @@ func LimitMixedStringLen(str string, maxByteCount int) (limitedStr string) { } return "" } + +// 限制的是字符数,不是字节数 +func LimitUTF8StringLen2(str string, maxRuneCount int) (limitedStr string) { + str2 := "" + bs := []byte(str) + bl := 0 + 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: + 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]) + } + } + if maxRuneCount > 0 { + if len(str2) > maxRuneCount { + runeList := []rune(str2) + if len(runeList) > maxRuneCount { + str2 = string(runeList[:maxRuneCount]) + } + } + } + return str2 +}