Go 语言字符(byte与rune)
Go 语言中,字符串 的每一个元素叫做字符,主要分为以下两种:
-
1、
uint8
类型,或者叫byte
型,代表了 ASCII 码的一个字符。提示:byte 类型是 unit8 的别名。
-
2、
rune
类型,代表了一个 UTF-8 字符。通常情况下,当需要处理中文、日文、韩文等复合字符时,需要用到rune
类型。
我们可以在 fmt.Println
中通过 %T
来输出变量的实际类型,代码如下:
package main
import "fmt"
func main() {
var a byte = 'q'
fmt.Printf("%d %T\n", a, a) // byte 的实际类型其实是个 uint8, 对应的 ASCII 编码为 113
var b rune = '犬'
fmt.Printf("%d %T\n", b, b) // rune 的实际类型其实是 int32, 对应的 Unicode 编码为 29356
}
代码输出如下:
113 uint8
29356 int32
图示:
go语言字符代码示例
得出结论:
byte
的实际类型其实是个uint8
, 对应的 ASCII 编码为 113;rune
的实际类型其实是int32
, 对应的 Unicode 编码为 29356;
Go 语言中,使用了 rune
类型来处理 Unicode 编码,这样让基于 Unicode 的文本处理更为方便,同时也可以用 byte
进行默认的字符串处理,这样对性能和拓展性都有照顾。
UTF-8 和 Unicode 有何区别?
Unicode 与 ASCII 都是一种字符集。
字符集为每个字符分配一个唯一的 ID,我们使用到的所有字符在 Unicode 字符集中都有一个唯一的 ID,例如 q 字符在 Unicode 与 ASCII 中的编码都是 113。汉字“犬”在 Unicode 中的编码为 29356,在不同国家的字符集中,字符所对应的 ID 也会不同。而无论任何情况下,Unicode 中的字符的 ID 都是不会变化的。
UTF-8 是编码规则,将 Unicode 中的字符 ID 以某种方式进行编码。UTF-8 是一种变长编码规则,从 1 到 4 个字节不等。编码规则如下:
- 0xxxxxx 表示文字符号 0~127,兼容 ASCII 字符集。
- 从 128 到 0x10ffff 表示其他字符。
在这种规则之下,拉丁文语系的字符编码一般情况下, 每个字符占用一个字节,而中文每个字符占用 3 个字节。