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

最近遇到的问题:

使用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
}

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

duolezengjie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值