iconv 判断字符编码_Golang处理MySQL字符集编码-Step4

安装七牛的转码包

$ go get -u gopkg.in/iconv.v1

a6c17164058d41e7772a61f2aab03fe8.png

看看go.mod文件发生了什么变化

13115009b3b07061295f1c1a8a47b2bd.png

step-3main.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

6c87253ded5aff018f097b1e7b616fd6.png

上图,在UTF8编码的Terminal中正常输出UTF8编码的字符串。

下图,对比看一下GBK编码的文件内容在UTF8编码的Terminal输出乱码。

说明我们上面的编码转换正确无误。

$ cat src_checkLines.txt

a6f94ecdfb999c5fc6d72f93a1391433.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值