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
}
按照行进行编码格式的转换,就避免了部分乱码的出现。