美文网首页
【Go】一个字符串趣题

【Go】一个字符串趣题

作者: 如雨随行2020 | 来源:发表于2021-12-06 19:45 被阅读0次

    @[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
    }
    

    相关文章

      网友评论

          本文标题:【Go】一个字符串趣题

          本文链接:https://www.haomeiwen.com/subject/ovsraltx.html