@[toc]
问题
给定一个字符串s和一个下标i,返回下标i对应的那个字节所在的字符。
字符串在Go中的底层是byte数组,Ascii范围内的字符使用一个字节表示,但是超过Ascii表示范围时字节数就不一定了,比如中文就是使用三个字节。但是,可以确定的是Go是采用UTF-8编码的,而UTF-8编码有如下规律
// UTF-8最多可用到6个字节, 实际位数最多有31位,即下表中x所表示的位
// 1字节 0xxxxxxx
// 2字节 110xxxxx 10xxxxxx
// 3字节 1110xxxx 10xxxxxx 10xxxxxx
// 4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
// 5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
// 6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
思路
1、找出字符第一个字节的规律
2、下标往前找到所求字符的第一字节位置,再往后找下一个字符的第一个字节位置
代码
// utf8中判断字节是否是字符第一个字节
// 1. ascii码(0-127)
// 2. 110xxxxxx 1110xxxx 等
func isFirstByte(c uint8) bool {
return c < 128 || c >= 192
}
// GetRune 找到指定位置字符的起始下标以及长度
func GetRune(s []byte, index int) (start int, length int) {
len := len(s)
if index < len {
return -1, -1
}
l, r := index, index+1
for l >= 0 && !isFirstByte(s[l]) {
l--
}
for r < len && !isFirstByte(s[r]) {
r++
}
return l, r - l
}
网友评论