Golang中rune類型的用法 - 中文處理

rune類型是Go語言的一種特殊數字類型,在builtin/builtin.go文件中,它的定義爲:type rune = int32;官方對它的解釋是:rune是類型int32的別名,在所有方面都等價於它,用來區分字符值跟整數值。由於Go語言中採用的是統一的UTF-8編碼,英文字母在底層佔1個字節,特殊字符和中文漢字則佔用1~3個字節,在Go語言中文的計數和截取並不如其他語言(比如Python)那麼容易,所以Go提供了rune類型來處理中文的計數和分割問題,以支持國際化多語言。

下面我們通過一個例子來感受一下Go中使用rune的兩個場景。

  • 統計帶中文字符串的長度
package main

import "fmt"

func main() {
	s := "阿福Chris"
	fmt.Println(len(s))         //輸出11
	fmt.Println(len([]rune(s))) //輸出7
}

從上面的例子可以看出,我們使用len函數取帶有中文的字符串長度時,獲得的並不是真正的字符個數,當然如果全都是英文是不存在這個問題的;在上面例子中,由於有中文,就影響到了對長度的正確衡量,此時,我們使用rune進行轉換,便可以獲得正確的長度。

  • 截取中文字符串
package main

import "fmt"

func main() {
	s := "阿福Chris"
	fmt.Println(s[:2])                 //輸出亂碼�
	fmt.Println(string([]rune(s)[:2])) //輸出阿福
}

從上面的例子可以看出,與長度計算一樣,如果不採用rune,想取“阿福”這兩個字,會從底層直接取前兩個字符串,這樣取出來的必然是亂碼;第二個打印中,採用了rune來取前兩個漢字就可以正常獲得結果了(注意這裏面使用了string是對漢字和編碼進行了轉換)。

最後附上一張“字符串”、“Unicode碼點”和“原始字節”的轉換表,方便大家理解爲什麼rune類型可以更好的完成中文的處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章