本文共 644 字,大约阅读时间需要 2 分钟。
网上大部分使用 rune 实现中文无乱码截取,但这种方法适合纯中文字符串,并不适合中英文混合且不知道各多少个的情况。
使用字符的最小存储单元,进行字符类型判定是比较好的解决办法。
代码入下:
func SubstrByByte(str string, length int) string { bs := []byte(str)[:length] 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 { return string(bs[:i+cl]) } return string(bs[:i]) } } return ""}
转载地址:http://eafob.baihongyu.com/