字符串中的每一个元素叫做“字符”,在遍历或者单个获取字符串元素时可以获得字符。
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)
可以发现,byte 类型的 a 变量,实际类型是 uint8,其值为 ‘a’,对应的 ASCII 编码为 97。
rune 类型的 b 变量的实际类型是 int32,对应的 Unicode 码就是 20320。
Go 使用了特殊的 rune 类型来处理 Unicode,让基于 Unicode 的文本处理更为方便,也可以使用 byte 型进行默认字符串处理,性能和扩展性都有照顾。
UTF-8 和 Unicode 有何区别?
字符集为每个字符分配一个唯一的 ID,我们使用到的所有字符在 Unicode 字符集中都有唯一的一个 ID 对应,例如上面例子中的 a 在 Unicode 与 ASCII 中的编码都是 97。“你”在 Unicode 中的编码为 20320,但是在不同国家的字符集中,“你”的 ID 会不同。而无论任何情况下,Unicode 中的字符的 ID 都是不会变化的。
UTF-8 是编码规则,将 Unicode 中字符的 ID 以某种方式进行编码。UTF-8 的是一种变长编码规则,从 1 到 4 个字节不等。编码规则如下:
0xxxxxx 表示文字符号 0~127,兼容 ASCII 字符集。
从 128 到 0x10ffff 表示其他字符。
根据这个规则,拉丁文语系的字符编码一般情况下,每个字符依然占用一个字节,而中文每个字符占用 3 个字节。
广义的 Unicode 指一个标准,定义字符集及编码规则,即 Unicode 字符集和 UTF-8、UTF-16 编码等。
本文学习来源于C语言中文网>Go语言教程