Go 字符串编码,Unicode 和UTF-8

1.字符串
字符串在Go语言中以原生数据类型出现,使用字符串就像使用其余原生数据类型(int、bool、 float3二、foat64等)同样。ui

字符串的值为双引号中的内容,能够在Go语言的源码中直接添加非ASCⅡ码字符编码

Go语言的字符串常见转义符包含回车、换行、单双引号、制表符等,以下所示spa

转移符 含义code

\r        回车符(返回行首)
\n        换行符(直接跳到下一行的同列位置)
\t        制表符
\'        单引号
\"        双引号
\\        反斜杠

2.字符串实现基于UTF-8编码blog

go 语言里的字符串的内部实现使用UTF8编码. 经过rune类型,能够方便地对每一个UTF-8字符进行访问。ip

固然,Go语言也支持按传统的ASCII码方式进行逐字符访问。ci

3.字符unicode

字符串中的每个元素叫作“字符”,在遍历或者单个获取字符非元素时能够得到字符。字符串

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.字符串格式化

clipboard.png