对于中英文混排的字符串,如果想截取指定长度的部分,PHP可以直接用mb_substring,不过go语言可没有类似的函数。把字符串转成[]rune可以避免中文被截断成乱码,但是中文和英文字符都会被当做一个字符,我们期望的是中文是两个字符,英文是一个字符。那么,我们只能自己实现一个go语言版的mb_substring了。
<pre class="EnlighterJSRAW" data-enlighter-group="" data-enlighter-highlight="" data-enlighter-language="golang" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-theme="" data-enlighter-title="">// 中英文混排截取字符串
// start:起始位置
// count:长度
func mbSubstring(s string, start, count int) string {
r := []rune(s)
ss := []rune{}
n := 0.0
for _, c := range r {
if c > 255 {
n++
} else {
n += 0.5
}
if int(n-0.5) < start {
continue
}
if int(n+0.5)-start > count {
break
}
ss = append(ss, c)
}
return string(ss)
}