c++ string 乱码_Go语言入门:string、rune

博客介绍了C++字符串的初始化,支持单行双引号和多行反单引号。提到字符串长度,len方法获取的是字节数,可通过特定方法获取预想长度。还指出对ASCII码字符串可类似Java substring操作,中文字符直接操作会乱码,需先转成rune表示的UTF8编码数组。

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

5306efa8e719a5da95ab060811e08d7f.png

初始化

msg := "hello world"cnMsg := "你好世界"multiline := `                select * from table                where col='val'            `

单行的字符串初始化和大部分语言一样,使用双引号,支持和python一样的多行,但是用反单引号,就是键盘上按键区最左上角的那个符号。

长度

msg := "hello world"fmt.Println(len(msg))cnMsg := "你好世界"fmt.Println(len(cnMsg))

上面两个打印字符串长度的代码会输出多少?11和4吗?错了,答案是11和16,len方法取得的结果是字符串所占用的字节数,go语言中的字符串使用的是可变长的UTF8编码,ASCII码占用1个字节,其它字符是2-4个字节,对于中文字符是3个字节。那如何取得我们预想的字符串长度:11和4?可以使用如下的两个方法:

fmt.Println(utf8.RuneCountInString(msg))fmt.Println(utf8.RuneCountInString(cnMsg))

这里的rune可以认为用于表示一个utf8编码,如果想把汉字字符串,一个个打印出来,可用如下方法实现:

cnMsg := "你好世界"msgRunes := []rune(cnMsg)for _, c := range msgRunes {    fmt.Println(string(c))}

SLICE

msg := "hello world"fmt.Println(msg[:5])fmt.Println(msg[6:])fmt.Println(msg[3:5])fmt.Println(msg[0])

对于ASCII码字符串可以使用上面的方法进行类似Java substring的操作,注意最后一个返回的是h的ASCII码值。对于中文字符如果也像上面的方式操作,打印出来的结果会是乱码,因为上面的操作是基于字节索引的,中文的substring要像下面这样操作,先转成rune表示的UTF8编码数组,然后基于UTF8编码索引:

cnMsg := "你好世界"fmt.Println(string([]rune(cnMsg)[0:1]))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值