go语言实现mb_substring

2020-08-14

go

对于中英文混排的字符串,如果想截取指定长度的部分,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)
}
 
阅读