golang解析excel、csv编码格式

本文涉及的产品
云解析DNS,个人版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: golang解析excel、csv编码格式

前言

比如 utf8gbkGB18030

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

目录
相关文章
|
15天前
|
数据格式 Python
【Python】已解决:Excel无法打开文件test.xIsx“,因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。
【Python】已解决:Excel无法打开文件test.xIsx“,因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。
56 0
|
21天前
|
存储 开发工具 git
好的git管理方法,标明项目_编号_(功能,不过还是在没有bug出现时就提交为好)+Excel表管理的格式
好的git管理方法,标明项目_编号_(功能,不过还是在没有bug出现时就提交为好)+Excel表管理的格式
|
1月前
|
Go 开发工具 git
GoLang 和 csv 常用操作
GoLang 和 csv 常用操作
15 1
|
1月前
|
算法 数据挖掘 大数据
深入解析力扣171题:Excel表列序号(进制转换法详解及模拟面试问答)
深入解析力扣171题:Excel表列序号(进制转换法详解及模拟面试问答)
|
22天前
|
存储 数据可视化 数据挖掘
|
1月前
|
JSON Go 数据格式
【golang】json数据解析 - 嵌套json解析
【golang】json数据解析 - 嵌套json解析
22 0
|
1月前
|
XML Java 数据格式
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
35 3
|
20天前
|
存储 安全 Java
深度长文解析SpringWebFlux响应式框架15个核心组件源码
以上是Spring WebFlux 框架核心组件的全部介绍了,希望可以帮助你全面深入的理解 WebFlux的原理,关注【威哥爱编程】,主页里可查看V哥每天更新的原创技术内容,让我们一起成长。
|
22天前
|
关系型数据库 分布式数据库 数据库
PolarDB-X源码解析:揭秘分布式事务处理
【7月更文挑战第3天】**PolarDB-X源码解析:揭秘分布式事务处理** PolarDB-X,应对大规模分布式事务挑战,基于2PC协议确保ACID特性。通过预提交和提交阶段保证原子性与一致性,使用一致性快照隔离和乐观锁减少冲突,结合故障恢复机制确保高可用。源码中的事务管理逻辑展现了优化的分布式事务处理流程,为开发者提供了洞察分布式数据库核心技术的窗口。随着开源社区的发展,更多创新实践将促进数据库技术进步。
25 3

推荐镜像

更多