字符串的内容不复杂,但是多,接下来作者准备写几篇归纳一下
Unicode主要解决各个国家之间编码各自为政的问题,比如说,我们国家的国标编码是GBK,而日本的“国标”编码是Shift_JIS。
假如我们写一句话“小明早上好”,这句字符串移到日本的计算机上肯定乱码,因为两者的编码不同。这种状况对信息交流非常不利,就像是两国语言互相不通一样。
于是Unicode就出现了,它的思路是把整个地球上的字符都收录到一张表中,每个字符位置固定,这样一下就不乱了。读者可以看出这个思路是简单有效的。
Unicode有三种实现方式,分别是UTF-32,UTF-16和UTF-8,其中UTF-32规定一个字符占4字节,不太合理。UTF-16做了妥协,使用2字节表示一个字符。而UTF-8是由Ken thompson发明的,属于变长编码。
因此,当我们实际说Unicode时,是指UTF-16。但是不管哪种编码实现,都不会超出4字节。
(注:关于编码的知识作者会在后面专门做一个系列解释清楚)
有了这些背景知识,rune就理解了,它是类型别名,实际是int32,因此它主要存储Unicode码点的,也就是UTF-16。
例如:
var a = '中'
fmt.Println(reflect.TypeOf(a).Name())
定义一个字符a,下面使用反射看看它的类型名是什么,结果显示int32,也就是rune类型。如果我们进一步问,这个值究竟是哪种编码呢?实际是UTF-16。
我们可以用5种方式来表示一个rune字面量:
var a="Go语言编程"
fmt.Println(len("Go语言编程"))
// 输出:14
字符串采用UTF-8编码,此处的len测的是字符串底层的字节长度,如果要统计字符串字符的长度,len不行。
我们可以使用rune将字符串强转一下,代码如下:
fmt.Println(len([]rune("Go语言编程")))
// 输出:6
s := "Go语言编程"
// 8=2*1+2*3
fmt.Println(s[0:8])
// 输出:Go语言
但是这种截取方式适用性不好,需要精确计算。一旦字符串过长就很难操作。使用rune可以解决这个问题:
s := "Go语言编程"
// 转成 rune 数组,需要几个字符,取几个字符
fmt.Println(string([]rune(s)[:4]))
// 输出:Go语言
rune类型只是一种名称叫法,表示用来处理长度大于 1 字节( 8 位)、不超过 4 字节( 32 位)的字符类型,对于包含中文的字符串很有用处。
页面更新:2024-03-17
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号