fmt.Printf相关参数介绍
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
s:="我爱中国人haha!"
fmt.Println(len(s))//20个字节 一个中文三个字节 15+4+1
fmt.Print("\n echo byte \n")
for k,v:= range []byte(s){
//0 1 2 三个字节代表的是我
//0----E6 ;1----88 ;2----91 ;3----E7 ;4----88 ;5----B1 ;6----E4 ;7----B8 ;8----AD ;9----E5 ;10----9B ;11----BD ;12----E4 ;13----BA ;14----BA ;15----68 ;16----61 ;17----68 ;18----61 ;19----21 ;
fmt.Printf("%d----%X ;",k,v)//字节的表示 utf8编码 一个中文需要三个字节 utf8是可变长的
}
fmt.Print("\n echo string \n")
for k,v:= range s{
//string 循环的时候 返回的是int32 就是rune
//0----6211 ;3----7231 ;6----4E2D ;9----56FD ;12----4EBA ;15----68 ;16----61 ;17----68 ;18----61 ;19----21 ;
fmt.Printf("%d----%X ;",k,v)
}
fmt.Print("\n echo RuneCountInString \n")
fmt.Println(utf8.RuneCountInString(s))//10位,代表多少个真实字数
b:=[]byte(s)
for len(b)>0{//unicode
ch,size:=utf8.DecodeRune(b)//每个字占多少字节
//value:25105---len: 3---字符:我;value:29233---len: 3---字符:爱;value:20013---len: 3---字符:中;value:22269---len: 3---字符:国;value:20154---len: 3---字符:人;value:104---len: 1---字符:h;value:97---len: 1---字符:a;value:104---len: 1len: 1---字符:a;value:33---len: 1---字符:!;
//但是我们看不到下标
fmt.Printf("value:%v---len: %d---字符:%c;",ch,size,ch)
b=b[size:]
//bytes:=b[size:]
}
// TODO Unicode和utf8的区别 rune
fmt.Print("\n echo rune \n")
for k,v:=range []rune(s) {//int32
//key:0---value: 25105---字符:我;key:1---value: 29233---字符:爱;key:2---value: 20013---字符:中;key:3---value: 22269---字符:国;key:4---value: 20154---字符:人;key:5---value: 104---字符:h;key:6---value: 97---字符:a;key:7---value: 104ue: 97---字符:a;key:9---value: 33---字符:!;
fmt.Printf("key:%v---value: %v---字符:%c;",k,v,v)
}
}
总结
- 我们可以说, string类型本质上就是一组字节组成的数组([]byte)。
- range 遍历 pos,rune 其中rune是int32 pos 是所在位置(并不是第几个,比如 0,3,6)
- 使用utf8.RuneCountInString(s) 可以获取字符数量(10)
- 使用len获取字节长度(20)
- 使用[]byte获取字节
- 使用[]rune 会完成转换,并开启一个新的rune类型的切片给我们
Go 默认的字符编码就是 UTF-8 类型。
- Go 语言的字符有以下两种:
一种是 uint8 类型,或者叫 byte 型( byte 是 unit8 的别名),代表了 ASCII 码的一个字符,占用 1 个字节。
一种是 rune 类型,代表一个 UTF-8 字符,当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。 rune 类型等价于 int32 类型,占用 4 个字节。rune 类型是 int32 的一个别名, rune 主要用于表示 UTF-8 编码时的字符类型。
UTF-8 和 Unicode 有何区别
- Unicode 与 ASCII 类似,都是一种字符集。
- Unicode 收集了这个世界上所有的符号系统,包括重音符号和其它变音符号,制表符和回车符,还有很多神秘的符号,每个符号都分配一个唯一的 Unicode 码点, Unicode 码点对应 Go 语言中的 rune 整数类型( rune 是 int32 等价类型)。
- UTF8 是一个将 Unicode 码点编码为字节序列的变长编码。 UTF8 编码使用 1 到 4 个字节来表示每个 Unicode 码点, ASCII 部分字符只使用 1 个字节,常用字符部分使用 2 或 3 个字节表示。可以说是对Unicode的加工