golang对字符串的处理操作 如何正确理解 rune byte和string

文章详细介绍了Go语言中fmt.Printf函数在处理字符串时涉及的UTF-8编码概念。通过示例代码展示了字节和Unicode码点(rune)之间的关系,以及如何使用utf8包进行编码操作。内容涵盖了字符串的字节长度、真实字符数、以及如何通过range遍历字符串和字节切片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的加工
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老A技术联盟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值