Go語言中的字元和字串

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

Go語言中的字元

在Go語言中,沒有字元類型,字元類型是rune類型,rune是int32的別稱。

下面用一個簡單的程式來示範字元類型:

package mainimport (    "fmt"    "reflect")func main() {    r := '我'    fmt.Printf("%q的類型為:%t 二進位為:%b\n", r, r, r)    rType := reflect.TypeOf(r).Kind()    fmt.Printf("r的實際類型為:%s\n", rType)}

程式輸出:

'我'的類型為:%!t(int32=25105) 二進位為:110001000010001r的實際類型為:int32

Go語言天生支援Unicode,那我產生一個問題:Unicode字元的長度是多少?
這個問題的問法有沒有問題?其實仔細想想,這樣問是有問題的。首先,Unicode的基礎是一個有編號的字元集,在字元集之上又規定了模組化的編碼等等技術層次,各種具體的編碼形式並不一致。因此,嚴格來說,Unicode是沒有“長度”這一說的,它是抽象的字元,只有Unicode的編碼才有具體的位元組長度。而且不同的編碼實現,長度也不一樣。

Unicode 目前規劃的總空間是17個平面(平面0至16),每個平面有 65536 個碼點。我們常用的平面0(「Basic Multilingual Plane」,即「BMP」)碼點範圍為0x0000 至 0xFFFF,這並不是 Unicode 的全部。

BMP 的字元是 Unicode 中最基礎和最常用的一部分,以 UTF-16 編碼時使用2位元組,以 UTF-8編碼時使用1至3位元組。超出 BMP 的字元以 UTF-16 或 UTF-8 編碼都需要4位元組。另外還有一個比較少用的編碼形式,UTF-32,它編碼任何 Unicode 字元都需要4個位元組。

Go語言中的字串

Go語言的字串有兩種方式來表示:

  • 雙引號,可以使用逸出字元,如s := "Go語言字串\n不能跨行賦值"
  • 反引號,字串跟反引號中的格式一樣,即Raw Type

    s := `Go原格式字串    可以跨行`

Go語言的字串是以UTF-8格式編碼並儲存的,下面有一個簡單的例子:

package mainimport (    "fmt")func main() {    s := "我"    fmt.Printf("s的類型為:%t, 長度為:%d, 16進位為:%x\n", s, len(s), s)    for i, b := range []byte(s) {        fmt.Printf("第%d個位元組為:%b\n", i, b)    }}

程式輸出:

s的類型為:%!t(string=我), 長度為:3, 16進位為:e68891第0個位元組為:11100110第1個位元組為:10001000第2個位元組為:10010001

變數s中存放的是這個字串的UTF-8編碼,當你使用len(s)函數擷取字串的長度時,擷取的是該字串的UTF-8編碼長度,儲存一個字元可能需要 2個、3個或者4個位元組,它是不固定的。

UTF-8的編碼遵循如下2條規則:

  • 對於單位元組的符號,位元組的第一位設為0,後面7位為這個符號的unicode碼。因此對於英語字母,UTF-8編碼和ASCII碼是相同的。
  • 對於n位元組的符號(n>1),第一個位元組的前n位都設為1,第n+1位設為0,後面位元組的前兩位一律設為10。剩下的沒有提及的二進位位,全部為這個符號的unicode碼。

根據這兩條簡單的規則,我們可以把UTF-8編碼轉換為Unicode的碼點:

//utf8轉為unicode          1110 0110 1000 1000 1001 0001 // s               0110   00 1000   01 0001 // s utf8 -> unicode          0000 0000 0110 0010 0001 0001 // s utf8 -> unicode0000 0000 0000 0000 0110 0010 0001 0001 // r

我們可以看到上面推導的結果跟程式的輸出結果相符。

參考

  • 字元編碼筆記:ASCII,Unicode和UTF-8

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.