golang string 字符集 与编码
1.字符串
字符串在Go语言中以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、 float32、foat64等)一样。
字符串的值为双引号中的内容,可以在Go语言的源码中直接添加非ASCⅡ码字符
Go语言的字符串常见转义符包含回车、换行、单双引号、制表符等,如下所示
转移符 含义
\r 回车符(返回行首)
\n 换行符(直接跳到下一行的同列位置)
\t 制表符
\' 单引号
\" 双引号
\\ 反斜杠
2.字符串实现基于UTF-8编码
go 语言里的字符串的内部实现使用UTF8编码. 通过rune类型,可以方便地对每个UTF-8字符进行访问。
当然,Go语言也支持按传统的ASCII码方式进行逐字符访问。
3.字符
字符串中的每一个元素叫做“字符”,在遍历或者单个获取字符非元素时可以获得字符。
Go语言的字符有以下两种:
一种是uint8类型,或者叫byte型,代表了ASCII码的一个字符。
另一种是rune类型,代表一个UTF-8字符。当需要处理中文、日文或者其他复合字符时,
则需要用到rune类型。rune类型实际是一个int32。
使用 fmt.Printf中的“%T”动词可以输出变量的实际类型,使用这个方法可以查看byte和rune的本来类型,代码如下:
var a byte = 'a'
fmt.Printf("%d %T\n", a, a)
var b rune='你'
fmt.Printf("%d %T\n", b, b)
输出如下
97 uint8
20320 int32
4.UTF-8和 Unicode有何区别?
Unicode是字符集。ASCⅡ也是一种字符集。
字符集为每个字符分配一个唯一的ID,我们使用到的所有字符在 Unicode字符集中都有唯一的一个ID对应,
例如上面例子中的a在 Unicode与ASCII中的编码都是97。
“你“在 Unicode中的编码为20320,但是在不同国家的字符集中,“你”的ID会不同。
而无论任何情况下, Unicode中的字符的ID都是不会变化的。
UTF-8是编码规则,将 Unicode中字符的ID以某种方式进行编码。UTF-8的是一种
变长编码规则,从1到4个字节不等。
5.计算字符串长度
tip := "genji is a ninja"
fmt.Println(len(tip))
tip2 := "认真"
fmt.Println(len(tip2))
结果:
16
6
len 表示字符串的ASCII 字符个数或字节长度
所以:
ASCII 字符串长度使用len() 长度
Unicode 字符串长度使用utf8.RuneCountInString()
5.字符串遍历
1.遍历每一个 ASCII 字符
直接使用for
2.按Unicode 字符遍历字符串
使用 range
str := "快乐 everyday"
for _, s := range str{
fmt.Printf("unicode: %c %d\n", s,s)
}
for i:=0;i<len(str) ;i++ {
fmt.Printf("ascii: %c %d\n", str[i], str[i])
}
结果如下:
unicode: 快 24555
unicode: 乐 20048
unicode: 32
unicode: e 101
unicode: v 118
unicode: e 101
unicode: r 114
unicode: y 121
unicode: d 100
unicode: a 97
unicode: y 121
ascii: å 229
ascii: ¿ 191
ascii: « 171
ascii: ä 228
ascii: ¹ 185
ascii: 144
ascii: 32
ascii: e 101
ascii: v 118
ascii: e 101
ascii: r 114
ascii: y 121
ascii: d 100
ascii: a 97
ascii: y 121
6.字符串格式化
Unicode 的问题
需要注意的是,Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
比如,汉字严的 Unicode 是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说,这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。
这里就有两个严重的问题,第一个问题是,如何才能区别 Unicode 和 ASCII ?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果 Unicode 统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。
它们造成的结果是:1)出现了 Unicode 的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示 Unicode。2)Unicode 在很长一段时间内无法推广,直到互联网的出现。
8、UTF-8
互联网的普及,强烈要求出现一种统一的编码方式。UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式。其他实现方式还包括 UTF-16(字符用两个字节或四个字节表示)和 UTF-32(字符用四个字节表示),不过在互联网上*本不用。重复一遍,这里的关系是,UTF-8 是 Unicode 的实现方式之一。
UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8 的编码规则很简单,只有二条:
1)对于单字节的符号:字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的;
2)对于n字节的符号(n > 1):第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码
参考:
https://segmentfault.com/a/1190000019361462
https://cloud.baidu.com/article/1845911
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
2023-01-04 文件系统