Go开发05 字符串彻底研究(一)rune

字符串的内容不复杂,但是多,接下来作者准备写几篇归纳一下

unicode和rune

Unicode主要解决各个国家之间编码各自为政的问题,比如说,我们国家的国标编码是GBK,而日本的“国标”编码是Shift_JIS。

假如我们写一句话“小明早上好”,这句字符串移到日本的计算机上肯定乱码,因为两者的编码不同。这种状况对信息交流非常不利,就像是两国语言互相不通一样。

于是Unicode就出现了,它的思路是把整个地球上的字符都收录到一张表中,每个字符位置固定,这样一下就不乱了。读者可以看出这个思路是简单有效的。

Unicode有三种实现方式,分别是UTF-32UTF-16UTF-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。

rune的五种形式

我们可以用5种方式来表示一个rune字面量:

rune的作用一:统计字符串长度

var a="Go语言编程"
fmt.Println(len("Go语言编程"))  
// 输出:14

字符串采用UTF-8编码,此处的len测的是字符串底层的字节长度,如果要统计字符串字符的长度,len不行。

我们可以使用rune将字符串强转一下,代码如下:

fmt.Println(len([]rune("Go语言编程")))  
// 输出:6

rune的作用二:截取字符串

s := "Go语言编程"
// 8=2*1+2*3
fmt.Println(s[0:8])  
// 输出:Go语言

但是这种截取方式适用性不好,需要精确计算。一旦字符串过长就很难操作。使用rune可以解决这个问题:

s := "Go语言编程"
// 转成 rune 数组,需要几个字符,取几个字符
fmt.Println(string([]rune(s)[:4])) 
// 输出:Go语言    

string和rune的关系图示

小结

rune类型只是一种名称叫法,表示用来处理长度大于 1 字节( 8 位)、不超过 4 字节( 32 位)的字符类型,对于包含中文的字符串很有用处。

展开阅读全文

页面更新:2024-03-17

标签:字符串   前导   后跟   字面   日本   字节   长度   字符   语言   类型

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top