golang解析excel、csv编码格式

本文涉及的产品
全局流量管理 GTM,标准版 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
  }
}

目录
打赏
0
4
4
0
138
分享
相关文章
csv和excel
【10月更文挑战第18天】csv和excel
225 5
关于商品详情 API 接口 JSON 格式返回数据解析的示例
本文介绍商品详情API接口返回的JSON数据解析。最外层为`product`对象,包含商品基本信息(如id、name、price)、分类信息(category)、图片(images)、属性(attributes)、用户评价(reviews)、库存(stock)和卖家信息(seller)。每个字段详细描述了商品的不同方面,帮助开发者准确提取和展示数据。具体结构和字段含义需结合实际业务需求和API文档理解。
Cobalt:开源的流媒体下载工具,支持解析和下载全平台的视频、音频和图片,支持多种视频质量和格式,自动提取视频字幕
cobalt 是一款开源的流媒体下载工具,支持全平台视频、音频和图片下载,提供纯净、简洁无广告的体验
680 9
Cobalt:开源的流媒体下载工具,支持解析和下载全平台的视频、音频和图片,支持多种视频质量和格式,自动提取视频字幕
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
479 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
【Python】已解决:Excel无法打开文件test.xIsx“,因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。
【Python】已解决:Excel无法打开文件test.xIsx“,因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。
764 0
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
334 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
Excel条件格式高级应用
【10月更文挑战第20天】Excel条件格式高级应用
143 3
|
6月前
|
Excel条件格式
【10月更文挑战第21天】Excel条件格式
167 2
Python 高级技巧:深入解析读取 Excel 文件的多种方法
在数据分析中,从 Excel 文件读取数据是常见需求。本文介绍了使用 Python 的三个库:`pandas`、`openpyxl` 和 `xlrd` 来高效处理 Excel 文件的方法。`pandas` 提供了简洁的接口,而 `openpyxl` 和 `xlrd` 则针对不同版本的 Excel 文件格式提供了详细的数据读取和处理功能。此外,还介绍了如何处理复杂格式(如合并单元格)和进行性能优化(如分块读取)。通过这些技巧,可以轻松应对各种 Excel 数据处理任务。
365 16
💥【exceljs】纯前端如何实现Excel导出下载和上传解析?
本文介绍了用于处理Excel文件的库——ExcelJS,相较于SheetJS,ExcelJS支持更高级的样式自定义且易于使用。表格对比显示,ExcelJS在样式设置、内存效率及流式操作方面更具优势。主要适用于Node.js环境,也支持浏览器端使用。文中详细展示了如何利用ExcelJS实现前端的Excel导出下载和上传解析功能,并提供了示例代码。此外,还提供了在线调试的仓库链接和运行命令,方便读者实践。
710 5

热门文章

最新文章

推荐镜像

更多