Go 语言字符(byte与rune)
一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 - 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/
截止目前, 星球 内专栏累计输出 80w+ 字,讲解图 3365+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2700+ 小伙伴加入学习 ,欢迎点击围观
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
图示:
得出结论:
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 个字节。