Go 语言字符(byte与rune)

发布于: 2020-11-13 16:21:13 作者: 犬小哈 最后修订时间: 2020-11-13 16:21:13

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 个字节。