场景

在golang中获取字符串长度的时候,第一个想法就是使用len()函数,在字符串包含中文的时候,程序错了。编写了test.go测试文件,代码如下所示。

package main

import (
    "fmt"
)

func main() {
    str := "test杨先森"
    fmt.Println("len(str)",len(str))
}

执行test.go文件,执行结果如下所示。

image.png

问题

最初我认为字符串长度应该是4个英文字母+3个汉字最初,最后结果是13。对,我没有看错就是13。
那唯一的可能,一个中文在这里被解析为3个字符了,而golang默认编码正好是utf-8。

那么我该怎么获取到字符串最真实的长度呢?我这里想获取4个英文字母+3三个汉字,长度为7呢?

解决方案

在这里需要引入两种方式

    //golang中的unicode/utf8包提供了用utf-8获取长度的方法
    fmt.Println("RuneCountInString:", utf8.RuneCountInString(str))

    //通过rune类型处理unicode字符
    fmt.Println("rune:", len([]rune(str)))

在test.go文件添加上面的代码,代码如下所示。

package main

import (
    "fmt"
    "unicode/utf8"
)

func main() {
    str := "test杨先森"
    //golang中string底层是通过byte数组实现的,直接使用len 实际是在按字节长度计算,golang默认使用utf-8编码的,所以一个汉字占3个字节。
    fmt.Println("len(str)", len(str))

    //以下两种都可以得到str的字符串长度
    //golang中的unicode/utf8包提供了用utf-8获取长度的方法
    fmt.Println("RuneCountInString:", utf8.RuneCountInString(str))

    //通过rune类型处理unicode字符
    fmt.Println("rune:", len([]rune(str)))

}

最终获取到了想要的字符串长度。

image.png

参考文献:

中文英文不同编码方式占位几何?
https://segmentfault.com/a/11...