ASCII
- ASCII 碼使用指定的7 位或8 位二進制數組合來表示128 或256 種可能的字符
- 標準ASCII 碼也叫基礎ASCII碼,使用7 位二進制數(剩下的1位二進制爲0)來表示所有的大寫和小寫字母,數字0 到9、標點符號,以及特殊控制字符
- 編號從0開始的32種狀態分別規定了特殊的用途,這些
0×20
以下的字節狀態稱爲控制碼- 例如
0x10
表示換行,0x07
b表示蜂鳴等
- 例如
- 127號之後的空位來表示新的字母、符號,還加入了很多畫表格時需要用下到的橫線、豎線、交叉等形狀
- 從128 到255這一頁的字符集被稱擴展字符集
GBK
- 爲了表示中文,我們把127號之後的奇異符號取消掉,並規定:一個小於127的字符的意義與原來相同,但兩個大於127的字符連在一起時,就表示一個漢字,這樣我們就可以組合出大約7000多個簡體漢字了
- 我們還把數學符號、羅馬希臘的字母、日文的假名們都編進去了,連在 ASCII 裏本來就有的數字、標點、字母都統統重新編了兩個字節長的編碼,這就是常說的”全角”字符,而原來在127號以下的那些就叫”半角”字符了
Unicode
- unicode是一個字符集,裏面幾乎包含了目前世界上已知的所有字符,且該字符集將二進制代碼和字符形成一一映射,即一個字符對應且只對應一個二進制代碼,反過來,一個二進制代碼對應且只對應一個字符
- Unicode字符碼是32位,4個字節
- 這個編號範圍從
0x000000
到0x10FFFF
(十六進制)
- Unicode字符集中對字符的編碼是長度不確定的,其中有的字符是兩個字符,有的是三個字符,這給計算機進行解碼帶來了困難
- 所以我們想給每個字符對應的二進制碼前加上一個標記,讓計算機看到這個標記就知道它將要讀取幾個字節,這樣就防止了上述描述的兩個字符因爲前兩個字節編碼相同而誤將三個字節的字符當成兩個字節的字符讀取了這種錯誤
- 這就是下面的UTF-8編碼
UTF-8
- 爲解決unicode如何在網絡上傳輸的問題,於是面向傳輸的衆多 UTF(UCS Transfer Format)標準出現了,顧名思義,UTF-8就是每次8個位傳輸數據,而UTF-16就是每次16個位。
- UTF-8 是以 8 位爲一個編碼單位的可變長編碼。會將一個碼位編碼爲 1 到 4 個字節
- UTF-8 採用了高位保留方式來區別不同變長
- 由於最高位不同,多字節中不會包含一字節的模式。對於 UTF-8 而言,二字節的模式也不會包含在三字節模式中,也不會在四字節中;三字節模式也不會在四字節模式中,這樣就解決了搜索匹配難題
- 每當進行搜索的時候,每個二字節和三字節的編碼沒有重疊,因爲最高位不同,所以不會出現搜索同一個出現兩個的結果。不過就是有效編碼空間少了
- UTF-8編碼有一個額外的好處,就是ASCII編碼實際上可以被看成是UTF-8編碼的一部分,所以,大量只支持ASCII編碼的歷史遺留軟件可以在UTF-8編碼下繼續工作
- Go裏面內建僅支持UTF8字符串編碼,因此如果你用
fmt.Printf
之類的函數無法將GBK等編碼隨意轉換打印- 在 Golang 中轉換 UTF-8 與 GBK 編碼的文本,可以使用 Go 官方的
golang.org/x/text
包實現
- 在 Golang 中轉換 UTF-8 與 GBK 編碼的文本,可以使用 Go 官方的