安装七牛的转码包
$ go get -u gopkg.in/iconv.v1
看看go.mod
文件发生了什么变化
在step-3
的main.go
编写转换方法toGBK
func toGBK(str string) string {
cd, err := iconv.Open("gbk", "utf-8") // convert utf-8 to gbk
if err != nil {
fmt.Println("iconv.Open failed!")
return ""
}
defer cd.Close()
return cd.ConvString(str)
}
编写转换方法toUTF8
func toUTF8(str string) string {
cd, err := iconv.Open("utf-8", "gbk") // convert gbk to utf-8
if err != nil {
fmt.Println("iconv.Open failed!")
return ""
}
defer cd.Close()
return cd.ConvString(str)
}
目前main方法,在GBK编码的Terminal中可以正常输出汉字,但是UTF8编码的Terminal中则输出乱码。
func main() {
srcCheckLines, _ := ReadLines("./src_checkLines.txt", nil)
for _, checkLine := range srcCheckLines {
fmt.Println(checkLine)
}
}
我们修改一下main方法,在输出字符串checkLine
前,将其转换成为UTF8字符串。
func main() {
srcCheckLines, _ := ReadLines("./src_checkLines.txt", nil)
for _, checkLine := range srcCheckLines {
fmt.Println(toUTF8(checkLine))
}
}
源代码
package main
import (
"bufio"
"bytes"
"fmt"
"gopkg.in/iconv.v1"
"io"
"os"
)
func main() {
srcCheckLines, _ := ReadLines("./src_checkLines.txt", nil)
for _, checkLine := range srcCheckLines {
fmt.Println(toUTF8(checkLine))
}
}
func toGBK(str string) string {
cd, err := iconv.Open("gbk", "utf-8") // convert utf-8 to gbk
if err != nil {
fmt.Println("iconv.Open failed!")
return ""
}
defer cd.Close()
return cd.ConvString(str)
}
func toUTF8(str string) string {
cd, err := iconv.Open("utf-8", "gbk") // convert utf-8 to gbk
if err != nil {
fmt.Println("iconv.Open failed!")
return ""
}
defer cd.Close()
return cd.ConvString(str)
}
//ReadLinesFilter 文本行过滤器
type ReadLinesFilter func(btline []byte) bool
//ReadLines 从文件中读取文本行列表
//
// 支持错误处理
// 支持自定义文本行过滤器
func ReadLines(path string, filter ReadLinesFilter) (lines []string, err error) {
var (
file *os.File
part []byte
prefix bool
)
if file, err = os.Open(path); err != nil {
return
}
defer file.Close()
reader := bufio.NewReader(file)
//@todo:
buffer := bytes.NewBuffer(make([]byte, 0))
for {
if part, prefix, err = reader.ReadLine(); err != nil {
break
}
buffer.Write(part)
if !prefix {
if filter != nil {
if filter(buffer.Bytes()) {
lines = append(lines, buffer.String())
}
} else {
lines = append(lines, buffer.String())
}
buffer.Reset()
}
}
if err == io.EOF {
err = nil
}
return
}
运行结果
$ go run main.go
上图,在UTF8编码的Terminal中正常输出UTF8编码的字符串。
下图,对比看一下GBK编码的文件内容在UTF8编码的Terminal输出乱码。
说明我们上面的编码转换正确无误。
$ cat src_checkLines.txt