乐趣区

关于golang:golang浅析rune数据类型

场景

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

package main

import ("fmt")

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

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

问题

最后我认为字符串长度应该是 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)))

}

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

参考文献:

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

退出移动版