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

相關文章
相關標籤/搜索