golang解析excel、csv编码格式
2022/11/28 4:25:01
本文主要是介绍golang解析excel、csv编码格式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
开箱即用的工具
@[toc]
前言
比如 utf8
、gbk
、GB18030
。
excel和csv中有多种编码格式,也是比较头疼的。这里提供多种解析方式。开箱即用的工具
源码
// 转为utf8格式 ConvertToString("你的字符")
package utils import ( "github.com/axgle/mahonia" "golang.org/x/text/encoding/simplifiedchinese" ) const ( GBK string = "GBK" UTF8 string = "UTF8" UNKNOWN string = "UNKNOWN" ) func ConvertToStringByCode(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 } func ConvertToStringGbkToUtf8(src string) string { if isUtf8([]byte(src)) { return src } var srcCode = "gbk" var tagCode = "utf-8" srcCoder := mahonia.NewDecoder(srcCode) srcResult := srcCoder.ConvertString(src) tagCoder := mahonia.NewDecoder(tagCode) _, cdata, _ := tagCoder.Translate([]byte(srcResult), true) result := string(cdata) return result } func ConvertToString(src string) string { if isUtf8([]byte(src)) { return src } if isGBK([]byte(src)) { utf8Data, err := simplifiedchinese.GBK.NewDecoder().Bytes([]byte(src)) if err != nil { return src } if isUtf8(utf8Data) { return string(utf8Data) } else { return ConvertToStringGbkToUtf8(string(utf8Data)) } } sink, err := simplifiedchinese.GB18030.NewDecoder().Bytes([]byte(src)) if err != nil { return src } return string(sink) } func isGBK(data []byte) bool { length := len(data) var i int = 0 for i < length { if data[i] <= 0x7f { //编码0~127,只有一个字节的编码,兼容ASCII码 i++ continue } else { //大于127的使用双字节编码,落在gbk编码范围内的字符 if data[i] >= 0x81 && data[i] <= 0xfe && data[i+1] >= 0x40 && data[i+1] <= 0xfe && data[i+1] != 0xf7 { i += 2 continue } else { return false } } } return true } func preNUm(data byte) int { var mask byte = 0x80 var num int = 0 //8bit中首个0bit前有多少个1bits for i := 0; i < 8; i++ { if (data & mask) == mask { num++ mask = mask >> 1 } else { break } } return num } func isUtf8(data []byte) bool { i := 0 for i < len(data) { if (data[i] & 0x80) == 0x00 { // 0XXX_XXXX i++ continue } else if num := preNUm(data[i]); num > 2 { // 110X_XXXX 10XX_XXXX // 1110_XXXX 10XX_XXXX 10XX_XXXX // 1111_0XXX 10XX_XXXX 10XX_XXXX 10XX_XXXX // 1111_10XX 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX // 1111_110X 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX // preNUm() 返回首个字节的8个bits中首个0bit前面1bit的个数,该数量也是该字符所使用的字节数 i++ for j := 0; j < num-1; j++ { //判断后面的 num - 1 个字节是不是都是10开头 if (data[i] & 0xc0) != 0x80 { return false } i++ } } else { //其他情况说明不是utf-8 return false } } return true } func GetStrCoding(data []byte) string { if isUtf8(data) == true { return UTF8 } else if isGBK(data) == true { return GBK } else { return UNKNOWN } }
这篇关于golang解析excel、csv编码格式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-20go-zero 框架的 RPC 服务 启动start和停止 底层是怎么实现的?-icode9专业技术文章分享
- 2024-12-19Go-Zero 框架的 RPC 服务启动和停止的基本机制和过程是怎么实现的?-icode9专业技术文章分享
- 2024-12-18怎么在golang中使用gRPC测试mock数据?-icode9专业技术文章分享
- 2024-12-15掌握PageRank算法核心!你离Google优化高手只差一步!
- 2024-12-15GORM 中的标签 gorm:"index"是什么?-icode9专业技术文章分享
- 2024-12-11怎么在 Go 语言中获取 Open vSwitch (OVS) 的桥接信息(Bridge)?-icode9专业技术文章分享
- 2024-12-11怎么用Go 语言的库来与 Open vSwitch 进行交互?-icode9专业技术文章分享
- 2024-12-11怎么在 go-zero 项目中发送阿里云短信?-icode9专业技术文章分享
- 2024-12-11怎么使用阿里云 Go SDK (alibaba-cloud-sdk-go) 发送短信?-icode9专业技术文章分享
- 2024-12-10搭建个人博客网站之一、使用hugo创建个人博客网站