Golang中unicode与字符编码理解

1 Go 语言字符编码基础

我们首先要知道

1)Go 语言的代码是由 Unicode 字符组成的,它们都必须由 Unicode 编码规范中的 UTF-8 编码格式进行编码并存储。

2)Unicode 编码规范中的编码格式定义的是:字符与字节序列之间的转换方式。其中的 UTF- 8 是一种可变宽的编码方案。

3)Go 语言中的一个string类型值会由若干个 Unicode 字符组成,每个 Unicode 字符都可 以由一个rune类型的值来承载。

2.下面举例说明

package main

import "fmt"

func main() {
	var s string = "hello 中国!"
	fmt.Println(len(s)) //13
}

上面简单的二行代码,使用len计算字符串的长度 ,打印结果是13,按照我们习惯应该是9个长度,go语言len函数则是计算字节的长度,我们都知道一个中文是3个字节,英文就是一个字节,因此len函数是计算字节的长度。如果我们向计算字符的长度怎么办呢,go语言另外个包,我们使用

fmt.Println(utf8.RuneCountInString(s)) // 9

上面打印就符合我们的习惯了 ,获取了正确的字符长度。

3.接下来我们来思考下字符传的循环操作,下面的显示什么

func main() {
	var s string = "hello 中国!"
	fmt.Println(len(s)) //13
	for i := 0; i < len(s); i++ {
		fmt.Printf("序号%d,字节:%c", i, s[i])
		fmt.Println()
	}
}

这个打印的结果: 

序号0,字节:h
序号1,字节:e
序号2,字节:l
序号3,字节:l
序号4,字节:o
序号5,字节: 
序号6,字节:ä
序号7,字节:¸
序号8,字节:­
序号9,字节:å
序号10,字节:
序号11,字节:½
序号12,字节:!

思考下为什么中文会显示乱码,英文可以正常显示,我们不难发现,使用的是 循环字节,一个中文是3个字节,上面的循环肯定会出现问题的,接下来要正常显示,我们使用for ...range 循环即可,for ...range 是对Unicode码一个个循环,避免了中文的乱码

func main() {
	var s string = "hello 中国!"
	for i,v := range s{
		fmt.Printf("序号%d,字节编码:%c",i,v)
		fmt.Println()
	}
}

结果:

序号0,字节编码:h
序号1,字节编码:e
序号2,字节编码:l
序号3,字节编码:l
序号4,字节编码:o
序号5,字节编码: 
序号6,字节编码:中
序号9,字节编码:国
序号12,字节编码:!

这样的循环就对了,很明显可以看出中文一个字符占3个字节长度。但是还有一个问题,我们可以看出啊 循环的序号不是顺序增加的,原因还是中文的问题,接下来我们来解决这个问题。

4.上面的说到的问题也很简单,我们思考下,只有把字符串变成rune数组,不管是中文还是英文都可以用一个Unicode来实现。然后再对rune数组循环,那么序号肯定正确的了,上面的代码稍微改下即可,代码如下:

func main() {
	var s string = "hello 中国!"
	for i,v := range []rune(s){
		fmt.Printf("序号%d,字节编码:%c",i,v)
		fmt.Println()
	}
}

结果如下:

序号0,字节编码:h
序号1,字节编码:e
序号2,字节编码:l
序号3,字节编码:l
序号4,字节编码:o
序号5,字节编码: 
序号6,字节编码:中
序号7,字节编码:国
序号8,字节编码:!

至此:go语言对字符串的循环都说完了,看后我相信你对字符串循环有了深刻的理解。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿磊的博客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值