欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

go语言 进行文件编码格式转换中(GBK 转UTF8),可能出错部分文件出现乱码情况的解决。

程序员文章站 2024-03-24 11:55:40
...

最近遇到的问题:

使用go语言进行开发项目,有一个模块是需要上传文件。但对于文件的编码格式不能有要求,也就是说上传的文件可以是GBK的编码格式,也可以是UTF8的编码格式。于是就出现了GBK脚本文件在上传的时候,会出现部分中文汉字乱码的情况。

当前的编码思路是:按照字节来读取上传的脚本,然后在对这些字节进行转码,最后在将这些字节重新拼接,写入到文件中。

buf := make([]byte,1024)
	
decoder := mahonia.NewDecoder("gb18030")
for {

	n, _ := f.Read(buf)
	
	if 0 == n {
		break
	}
	//解码为UTF-8
		
	str = str + decoder.ConvertString(string(buf[:n]))
}

出现的问题:有些GBK的文件可以正常,但是有时候会出现部分中文乱码。

解决问题:

go语言对于编码格式的执行,go语音仅支持utf8这种编码格式,对于其他的编码格式都需要进行转码显示。

所以在脚本编码格式是GBK的时候,需要进行转码。gb18030是gbk的超类,可以更好的转码。

go语言中转码需要用到的包:    "github.com/code.google.com/p/mahonia"

在进行编码格式转换的时候,分为两种情况:

(1)按照字节进行转换。(也就是一开始我的这种转换方式)。英文站1个字节,汉字站2个字节。f.Read(buf)将文件中的数据读取到buf的时候,只能一个一个字节的存储。假如1024和1025这两的字节是一个汉字。但是正好buf只能存储1024个字节,那么这个汉字就会出现乱,就会导致后面的需要汉字出现乱码。这也就是为什么一开自己的问题

(2)按照行进行读取文件。对一行的数据进行编码格式的转换。

rd := bufio.NewReader(f)
for {
	line, err := rd.ReadString('\n') //以'\n'为结束符读入一行

	if err != nil || io.EOF == err {
		break
	}
	str =str +ConvertToString(line,"GBK","UTF-8")
}

//GBK转utf8的方法
func ConvertToString(src string, srcCode string, tagCode string) string {
	srcCoder := mahonia.NewDecoder(srcCode)
	srcResult := srcCoder.ConvertString(src)
	tagCoder := mahonia.NewDecoder(tagCode)
	_, cdata, _ := tagCoder.Translate([]byte(srcResult), true)
	result := string(cdata)
	return result
}

按照行进行编码格式的转换,就避免了部分乱码的出现。