不同的输入源可以使用不同的字符集,用Go开发的应用中也不例外。现在许多用户都使用的Windows系统,当然也有其他的系统。默认情况下,Go希望程序中使用的字符编码都为UTF-8。如果不是,则必须对给定的字符集进行解码,以便能够正确处理字符串。本文将介绍非UTF-8的字符集如何进行文件读写。
读/写不同的字符集
Golang 版本
1.12.1
前言
不同的输入源可以使用不同的字符集,用Go开发的应用中也不例外。现在许多用户都使用的Windows系统,当然也有其他的系统。默认情况下,Go希望程序中使用的字符编码都为UTF-8。如果不是,则必须对给定的字符集进行解码,以便能够正确处理字符串。本文将介绍非UTF-8的字符集如何进行文件读写。
实现
package main
import (
"fmt"
"golang.org/x/text/encoding/charmap"
"io/ioutil"
"os"
)
func main() {
// 将字符串编码为Windows-1252并写入文件
encoder := charmap.Windows1252.NewEncoder()
s, e := encoder.String("This is sample text with runes Š")
if e != nil {
panic(e)
}
ioutil.WriteFile("example.txt", []byte(s), os.ModePerm)
// 解码为UTF-8
f, e := os.Open("example.txt")
if e != nil {
panic(e)
}
defer f.Close()
decoder := charmap.Windows1252.NewDecoder()
reader := decoder.Reader(f)
b, err := ioutil.ReadAll(reader)
if err != nil {
panic(err)
}
fmt.Println(string(b))
}
$ go run main.go
This is sample text with runes Š
原理
golang.org/x/text/encoding/charmap
包中包含广泛使用的字符集的Charmap
类型指针常量。 Charmap
类型提供了为给定字符集创建编码器和解码器的方法。 Encoder
创建编码Writer
,它将写入的字节编码到所选的字符集。 类似地,Decoder
可以创建解码Reader
,其将读取到的所有数据解码到所选的字符集。