Go语言实用库02——文本编码

编码转换

假设有一文本,编码为GBK,文本内容为:

1
2
你好,中国
我爱你,中国!

由于Go默认按照utf-8的码表去解析,所以会导致乱码

Go官方提供的库里面,有一个库可以解决这个问题,但是不包含在标准库内,需要使用go get golang.org/x/text下载

提醒:下载之前请一定配置代理,可参考这篇文章

使用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package main

import (
"fmt"
"golang.org/x/text/encoding/simplifiedchinese"
"golang.org/x/text/transform"
"io/ioutil"
"os"
)

const path = "/Users/sherlockgy/Desktop/test.txt"

func main() {
file, e := os.Open(path)
if e != nil {
panic("打开文件错误!")
}

// 编码转换
newReader := transform.NewReader(file, simplifiedchinese.GBK.NewDecoder())

newBytes, e := ioutil.ReadAll(newReader)

if e != nil {
panic("读取内容错误!")
}

fmt.Printf("%s\n", newBytes)
}

编码猜测

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
const path = "/Users/sherlockgy/Desktop/test.txt"

func main() {
file, e := os.Open(path)
if e != nil {
panic("打开文件错误!")
}

// 编码猜测
encoding := determineEncoding(file)

// 编码转换
newReader := transform.NewReader(file, encoding.NewDecoder())

newBytes, e := ioutil.ReadAll(newReader)

if e != nil {
panic("读取内容错误!")
}

fmt.Printf("%s\n", newBytes)
}

// 猜测编码类型
func determineEncoding(r io.Reader) encoding.Encoding {
bytes, err := bufio.NewReader(r).Peek(1024)
if err != nil {
panic(err)
}
encoding, name, certain := charset.DetermineEncoding(bytes, "")
fmt.Printf("编码类型为:%s\n是否确定:%v\n", name, certain)
return encoding
}