请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

汉字3字节,rune4字节,为什么index[3]的下一个是index[6]?

如标题,汉字占3个字节,rune是4个字节的,那么既然是以rune的结构存放的汉字,那么每个数据都应该是4个字节才对啊,为什么index[3]的下一个汉字的其实index是6?
图片描述

正在回答

1回答

go语言的字符串本身是utf-8编码的,汉子占三个字节,所以[3]后面是[6]

当我们用for循环来拿里面的元素时,for i, ch := range s,这里获得的ch已经经过了utf-8 => unicode的转换,转换的结果放在了ch里面。utf-8和unicode是不同的编码方式。

我们这里也看到,这个字符的utf-8编码是0xE68595,而我们拿到的ch是0x7231,go语言的运行环境已经帮我们做了一次转换

0 回复 有任何疑惑可以回复我~
  • 提问者 拧壶冲 #1
    也就是说在字符串里面的时候 一个汉字是3个字节,而在用for语句取出了rune的汉字,就做了一次转化,将转码的unicode存到ch的变量中,这时unicode是占4个字符的。
    
    那当我们执行for i, ch := range s的时候,s中的字符串应该是被复制到了新的地址吧?而且是一个连续的4*s.length个字节长度。s的内容都被转码复制到这个新的地址, ch就是for的时候根据slice的顺序访问连续空间中的元素
    回复 有任何疑惑可以回复我~ 2020-09-03 06:28:52
  • ccmouse 回复 提问者 拧壶冲 #2
    第一段是对的。第二段,它不需要新开辟连续的空间。for的时候,UTF-8发现是中文三字节,就把三个字节取出,作转换,转换后的结果赋值给ch就行。就相当于一个整数赋值。
    回复 有任何疑惑可以回复我~ 2020-09-03 18:28:28
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信