golang——字符串与编码
1、字符编码
(1)ASCII码
⼀个字节表⽰的英⽂、数字、标点符号等字符。
国际标准ASCII码为0-127即128个字符,⼆进制最⾼位为0,其余为扩展ASCII码。
(2)GB2312
两字节,主要包含简体的常⽤中⽂及符号的字符集编码。
(3)GBK
go语言字符串转数组
单双字节变长编码,主要包含简体与繁体中⽂和⼀些符号、偏旁部⾸的字符集编码。
(4)GB18030
GBK编码⽆法满⾜需求扩展,多出来的部分使⽤四字节编码,即单、双、四字节编码;
扩展了汉字,还包括了少数民族⽂字;
(5)Unicode
因各国语⾔、字符差异,Unicode将所有字符统⼀为⼀套字符集。
UTF-8、UTF-16、UTF-32是对Unicode字符集的不同编码⽅案。
(6)UTF-8
变长编码⽅式,1-4字节表⽰⼀个字符,可节省存储空间;
英⽂1字节,中⽂⼀般3字节,最多4字节;
编码规则:
》单字节:同标准ASCII码,最⾼位为0,0-127表⽰128个字符
》多字节:n字节,⾼位到低位,第⼀字节前n位为1,第n+1位为0;后⾯字节前两位为10;剩余位由低位向⾼位填补Unicode吗,多出补0;
110XXXXX 10XXXXXX
1110XXXX 10XXXXXX 10XXXXXX
2、字符串遍历
golang使⽤utf-8的编码⽅式
2.1、for循环遍历字符串
func main() {
str := "test笃志弘毅"
for i := 0; i < len(str); i++ {
fmt.Printf("%v %c,", str[i], str[i])
}
}
//116 t,101 e,115 s,116 t,231 ç,172 ¬,131 ,229 å,191 ¿,151 ,229 å,188 ¼,152 ,230 æ,175 ¯,133 ,
  以下标访问字符串时,按单字节(byte)访问,超出单字节的编码会出现乱码。
2.2、for range遍历字符串
func main() {
str := "test笃志弘毅"
for i, v := range str {
fmt.Printf("%d-%c-%v ", i, v, v)
}
}
//0-t-116 1-e-101 2-s-115 3-t-116 4-笃-31491 7-志-24535 10-弘-24344 13-毅-27589
  for range遍历字符串时,按字符(rune)访问,中⽂正常显⽰
3、字符串转字符切⽚和字节切⽚的差异
func main() {
str := "test笃志弘毅"
runeS := []rune(str)
for i := 0; i < len(runeS); i++ {
fmt.Printf("%c-%v ", runeS[i], runeS[i])
}
fmt.Println()
byteS := []byte(str)
for i := 0; i < len(byteS); i++ {
fmt.Printf("%c-%v ", byteS[i], byteS[i])
}
}
//t-116 e-101 s-115 t-116 笃-31491 志-24535 弘-24344 毅-27589
//t-116 e-101 s-115 t-116 ç-231 ¬-172 -131 å-229 ¿-191 -151 å-229 ¼-188 -152 æ-230 ¯-175 -133 4、字符串注意点
(1)字符串的零值为空串"",不是nil
func main() {
var str string
fmt.Println(str == "") //true
//fmt.Println(str == nil)
//invalid operation: str == nil (mismatched types string and nil)
//⽆效操作(string和nil类型不匹配)
}
(2)索引访问或是切⽚得到的都是按字节处理,可能出现乱码
(3)len函数返回的是字节数,⽽不是字符数 
func main() {
str := "test笃志弘毅"
fmt.Println(len(str))//16
}
(4)不能通过索引或指针修改字符串字符
func main() {
str := "test笃志弘毅"
str[2] = 'a'    //cannot assign to str[2]
*(&str[2]) = 'b' // cannot take the address of str[2]
fmt.Println(str)
}
(5)字符串的切⽚操作返回的是字符串,⽽不是切⽚
func main() {
str := "test笃志弘毅"
str1 := str[:]
str2 := str[:]
fmt.Printf("%T %p %p\n", str1, &str1, &str2)
}
//string 0xc0000581c0 0xc0000581d0

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。