Go語言字符類型(byte和rune)
字符串中的每一個元素叫做“字符”,在遍歷或者單個獲取字符串元素時可以獲得字符。
Go 語言的字符有以下兩種:
- 一種是 uint8 類型,或者叫 byte 型,byte類型的值需用8個比特位表示,代表了 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
可以發現,byte 類型的 a 變量,實際類型是 uint8,其值爲 'a',對應的 ASCII 編碼爲 97。
rune 類型的 b 變量的實際類型是 int32,對應的 Unicode 碼就是 20320。
Go 使用了特殊的 rune 類型來處理 Unicode,讓基於 Unicode 的文本處理更爲方便,也可以使用 byte 型進行默認字符串處理,性能和擴展性都有照顧。
UTF-8 和 Unicode 有何區別?
Unicode 是字符集,ASCII 也是一種字符集。
字符集爲每個字符分配一個唯一的 ID,我們使用到的所有字符在 Unicode 字符集中都有唯一的一個 ID 對應,例如上面例子中的 a 在 Unicode 與 ASCII 中的編碼都是 97。“你”在 Unicode 中的編碼爲 20320,但是在不同國家的字符集中,“你”的 ID 會不同。而無論任何情況下,Unicode 中的字符的 ID 都是不會變化的。
- UTF-8 是編碼規則,將 Unicode 中字符的 ID 以某種方式進行編碼。UTF-8 的是一種變長編碼規則,從 1 到 4 個字節不等。編碼規則如下:
0xxxxxx 表示文字符號 0~127,兼容 ASCII 字符集。 - 從 128 到 0x10ffff 表示其他字符。
根據這個規則,拉丁文語系的字符編碼一般情況下,每個字符依然佔用一個字節,而中文每個字符佔用 3 個字節。
廣義的 Unicode 指一個標準,定義字符集及編碼規則,即 Unicode 字符集和 UTF-8、UTF-16 編碼等。
視頻和代碼
鏈接:https://pan.baidu.com/s/1XLyXP9Hadyl3j4mpMC-rLw
提取碼:89ux