Go-字符串编码Unicode-和UTF8

14次阅读

共计 1525 个字符,预计需要花费 4 分钟才能阅读完成。

1. 字符串
字符串在 Go 语言中以原生数据类型出现, 使用字符串就像使用其他原生数据类型 (int、bool、float32、foat64 等) 一样。

字符串的值为双引号中的内容, 可以在 Go 语言的源码中直接添加非 ASCⅡ码字符

Go 语言的字符串常见转义符包含回车、换行、单双引号、制表符等, 如下所示

转移符 含义

\r        回车符(返回行首)
\n        换行符(直接跳到下一行的同列位置)
\t        制表符
\'        单引号
\"        双引号
\\        反斜杠

2. 字符串实现基于 UTF- 8 编码

go 语言里的字符串的内部实现使用 UTF8 编码. 通过 rune 类型, 可以方便地对每个 UTF- 8 字符进行访问。

当然,Go 语言也支持按传统的 ASCII 码方式进行逐字符访问。

3. 字符

字符串中的每一个元素叫做“字符”, 在遍历或者单个获取字符非元素时可以获得字符。

Go 语言的字符有以下两种:

一种是 uint8 类型, 或者叫 byte 型, 代表了 ASCII 码的一个字符。另一种是 rune 类型, 代表一个 UTF- 8 字符。当需要处理中文、日文或者其他复合字符时,
则需要用到 rune 类型。rune 类型实际是一个 int32。

使用 fmt.Printf 中的“%T”动词可以输出变量的实际类型, 使用这个方法可以查看 byte 和 rune 的本来类型, 代码如下:

var a byte = 'a'
fmt.Printf("%d %T\n", a, a)

var b rune='你'
fmt.Printf("%d %T\n", b, b)

输出如下
97 uint8
20320 int32

4.UTF- 8 和 Unicode 有何区别?

Unicode 是字符集。ASCⅡ也是一种字符集。

字符集为每个字符分配一个唯一的 ID, 我们使用到的所有字符在 Unicode 字符集中都有唯一的一个 ID 对应,
例如上面例子中的 a 在 Unicode 与 ASCII 中的编码都是 97。

“你“在 Unicode 中的编码为 20320, 但是在不同国家的字符集中,“你”的 ID 会不同。
而无论任何情况下, Unicode 中的字符的 ID 都是不会变化的。

UTF- 8 是编码规则, 将 Unicode 中字符的 ID 以某种方式进行编码。UTF- 8 的是一种
变长编码规则, 从 1 到 4 个字节不等。

5. 计算字符串长度

tip := "genji is a ninja"

fmt.Println(len(tip))

tip2 := "认真"
fmt.Println(len(tip2))

结果:16
6

len 表示字符串的 ASCII 字符个数或字节长度

所以:
ASCII 字符串长度使用 len() 长度
Unicode 字符串长度使用 utf8.RuneCountInString()

5. 字符串遍历
1. 遍历每一个 ASCII 字符
直接使用 for

2. 按 Unicode 字符遍历字符串
使用 range

str := "快乐 everyday"

    for _, s := range str{fmt.Printf("unicode: %c %d\n", s,s)
    }

    for i:=0;i<len(str) ;i++  {fmt.Printf("ascii: %c %d\n", str[i], str[i])
}

结果如下:

unicode: 快 24555
unicode: 乐 20048
unicode: 32
unicode: e 101
unicode: v 118
unicode: e 101
unicode: r 114
unicode: y 121
unicode: d 100
unicode: a 97
unicode: y 121

ascii: å 229
ascii: ¿ 191
ascii: « 171
ascii: ä 228
ascii: ¹ 185
ascii:  144
ascii: 32
ascii: e 101
ascii: v 118
ascii: e 101
ascii: r 114
ascii: y 121
ascii: d 100
ascii: a 97
ascii: y 121

6. 字符串格式化

正文完
 0