Golang的字符編碼介紹
作者:尹正傑
版權聲明:原創作品,謝絕轉載!否則將追究法律責任。
Go里面內建僅支持UTF8字符串編碼,因此如果你用fmt.Printf之類的函數無法將GBK,GB2312等編碼隨意轉換打印。在 Golang 中轉換 UTF-8 與 GBK 編碼的文本,可以使用 Go 官方的 golang.org/x/text 包實現,這個包可以通過下面的命令安裝:“go get golang.org/x/text”。
如果訪問 golang.org 站點存在困難,也可以使用下面的命令通過 github 下載 text 包的代碼,下載完成后,再手工將其移動至 $GOROOT
目錄中完成安裝。
1 [root@yinzhengjie github.com]# git clone --depth 1 https://github.com/golang/text.git 2 [root@yinzhengjie github.com]# ll 3 總用量 24 4 drwxr-xr-x+ 3 root root 4096 12月 5 16:14 gorilla 5 drwxr-xr-x+ 3 root root 4096 11月 22 09:43 Go-SQL-Driver 6 drwxr-xr-x+ 20 root root 4096 12月 7 12:30 text 7 [root@yinzhengjie github.com]# pwd 8 /yinzhengjie/golang/path/src/github.com 9 [root@yinzhengjie github.com]# mkdir -p golang.org/x/ 10 [root@yinzhengjie github.com]# cp text -R golang.org/x/ 11 [root@yinzhengjie github.com]# go env | grep GOROOT 12 GOROOT="/yinzhengjie/golang/local" 13 [root@yinzhengjie github.com]# cp -r /yinzhengjie/golang/path/src/github.com/golang.org /yinzhengjie/golang/local/src/ 14 [root@yinzhengjie github.com]#
接下來我們看一個典型的案例:
1 package main 2 3 import ( 4 "bytes" 5 "golang.org/x/text/encoding/simplifiedchinese" 6 "golang.org/x/text/transform" 7 "io/ioutil" 8 "fmt" 9 ) 10 11 func GbkToUtf8(s []byte) ([]byte, error) { 12 reader := transform.NewReader(bytes.NewReader(s), simplifiedchinese.GBK.NewDecoder()) 13 d, e := ioutil.ReadAll(reader) 14 if e != nil { 15 return nil, e 16 } 17 return d, nil 18 } 19 20 21 func Utf8ToGbk(s []byte) ([]byte, error) { 22 reader := transform.NewReader(bytes.NewReader(s), simplifiedchinese.GBK.NewEncoder()) 23 d, e := ioutil.ReadAll(reader) 24 if e != nil { 25 return nil, e 26 } 27 return d, nil 28 } 29 30 func main() { 31 s := "尹正傑到此一游" 32 gbk, err := Utf8ToGbk([]byte(s)) 33 if err != nil { 34 fmt.Println(err) 35 } else { 36 fmt.Println("以GBK的編碼方式打開:",string(gbk)) 37 } 38 39 utf8, err := GbkToUtf8(gbk) 40 if err != nil { 41 fmt.Println(err) 42 } else { 43 fmt.Println("以UTF8的編碼方式打開:",string(utf8)) 44 } 45 }
以上代碼執行結果如下: