字元
字元梗概
-
,ASCII字元集 → (GB2312,BIG5,GBK...) → unicode通用字元集 → utf-8
-
,一個符号對應一個數字編号,數字編号即可以二進制形式表示這個字元ascii子符集
-
,是各個語言以自己國家語言為标準制定的字元編碼規則GB2312,BIG5,GBK等編碼
-
,unicode 學術學會制作的unicode
,實作了跨語言、跨平台的文本轉換與處理全球統一化的通用字元集
-
,是一種變長編碼與解碼規則,ascii 字元集及其他常用字元集編碼與解碼用一個位元組表示,而漢字編碼與解碼由 3 個位元組表示utf-8
-
- 關系
-
ascii 編碼,表示 128 個英文字元與二進制間的關系,gbk
編碼是漢字編碼,一個 ascii 字元由 1 個位元組組成,一個漢字由多個字元組成;utf8
- unicode 規定了不同字元在二進制上的表示形式,但是并沒有規定改如何存儲,有些需要 3 個字元,有些需要 2 個字元,想 a 這種字元,ascii 用一個位元組就能表示,但是在 unicode 中會用 2 個位元組,空間浪費
- utf-8 解決 unicode 編碼存儲問題,它是一種變長的編碼方式,ascii 碼表裡的字元仍然用一個位元組來存儲,一個漢字用 3 個位元組來存儲
-
- 編碼/解碼模闆
編号 編碼模闆 [0,127]
0???????
[128,2047]
110????? 10??????
[2048,65535]
1110???? 10?????? 10??????
string
type StringHeader struct {
Data uintptr
Len int
}
-
存儲的是資料,存儲在隻讀記憶體中的,不能對已經定義的字元串進行修改Data
-
表示存儲資料占用的位元組(byte)數,例Len
占用 10 個位元組,前 4 個字母對應一個 unicode 碼點,eggo世界
由 utf8 編碼後由 3 個 unicode 表示,界同理世
- 示例
package main
import (
"fmt"
)
/**
值類型:列印位址,直接用取值符(&)列印。
引用類型:列印位址,%p 列印
*/
func main() {
s1 := "eggo世界"
fmt.Printf("%c\n", s1[2]) // 字元串底層是隻讀的位元組數組,可以通過索引擷取值
fmt.Printf("s1: addr=%v,value=%v \n", &s1, s1)
fmt.Printf("s1: addr=%p\n", &s1)
bs := ([]byte)(s1) // 重新配置設定記憶體,并拷貝s1的内容到[]byte切片中
bs[2] = 'o'
fmt.Printf("%c\n", bs[2])
// [101 103 111 111 228 184 150 231 149
// 140],228和184和150共同組成了世,231和149和140 共同組成了界
fmt.Printf("bs: value=%v \n", bs)
fmt.Printf("bs: addr=%p \n", bs)
}
- 引用