Go 语言字符(byte与rune)

更新时间 2022-03-31 14:50:01

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 50w+ 字,讲解图 2200+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 1700+ 小伙伴加入学习 ,欢迎点击围观

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语言字符代码示例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 个字节。