bug:生产问题,Golang解决csv文件用excel打开中文乱码问题

news2024/11/19 11:30:50

bug:Golang解决csv文件用excel打开中文乱码问题

1 场景及分析

场景:今天在生成csv文件之后,测试发现用office和wps打开乱码

  • 分析:经过测试之后发现使用记事本打开不乱码,同时用记事本打开之后另存为ANSI编码之后用office和wps打开之后也不乱码
  • 由此可以断定应该是生成的csv文件缺少bom头导致,office和wps无法断定使用哪种编码打开文件,最终产生中文乱码问题

拓展:BOM头

BOM(Byte Order Mark字节顺序标记)是用来判断文本文件是哪一种Unicode编码的标记,其本身是一个Unicode字符(“\uFEFF”),位于文本文件头部。 在不同的Unicode编码中,对应的bom的二进制字节也不同,因此在文件写入的时候,我们通常根据BOM头判断是哪种编码

2 解决

由此可以知道,是因为我们的文件没有BOM头导致中文乱码,所以我们对症下药,直接写入BOM头即可

  • writer.Write([]string{“\xEF\xBB\xBF”})
package main

import (
	"encoding/csv"
	"fmt"
	"os"
)

func writeBom(fileName string) {
	//1. 打开文件
	f, err := os.OpenFile(fileName, os.O_RDWR, 0666)
	if err != nil {
		fmt.Println("open file error, err=", err)
	}
	//2. 获取文件的writer
	writer := csv.NewWriter(f)
	//3. 写入UTF-8编码的BOM头[根据自己文件编码写入对应的BOM头即可]
	//写入UTF-8 BOM头,避免使用excel软件打开.csv文件出现中文乱码
	err = writer.Write([]string{"\xEF\xBB\xBF"})
	if err != nil {
		fmt.Println("写入bom头失败...")
		return
	}
	//4. 刷新
	writer.Flush()
	fmt.Println("写入bom头成功....")
}
func main() {
	fileName := "E:\\Go\\GoPro\\src\\go_code\\demo01\\bom\\test.csv"
	writeBom(fileName)
}

结果:

写入之后,用十六进制查看

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/543144.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详解java中的日期与时间;新旧API对比;各种日期格式转换

一、基本概念 1、本地时间 不同的时区,在同一时刻,本地时间是不同的。全球一共分为24个时区,伦敦所在的时区称为标准时区,其他时区按东/西偏移的小时区分,北京所在的时区是东八区。 2、时区 GMT GMT08:0…

Linux基础指令(含英文注释)

前言: Linux下一切皆文件。 文件 文件内容 文件属性。 操作文件 对内容的操作 对属性的操作。 主要的文件是目录文件dir,和普通文件。(还有其它的) 一、ls/pwd 1、ls 对于目录,该命令列出该目录下的所有子目…

建站笔记——跟小枫社长学建站

该文章为看视频时的一些笔记,完整版可以看小枫社长的视频 小枫社长视频原址 一、租云服务器 学生或者新人可以免费试用几个月 腾讯云阿里云 阿里云对控制台进行了全面升级,在首页使用了新的设计方案,云服务器ECS位置如下,点击左…

浙大数据结构第六周之初识图

题目详情:06-图1 列出连通集 给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。 输入格式: 输入第1…

SAP从入门到放弃系列之MTS策略测试记录

​包括:10策略、11策略、30策略、40策略、52策略、63策略。 10策略 业务特点: 策略 10 在大规模生产场景中特别有用,它通常与重复制造 (REM) 相结合。如果企业PMC排产时,希望产品由生产计划(需求管理)决…

了解“感应雷”危害,针对性防护

直击雷的危害,比较容易理解,其防范措施也相对简单明了——避雷针、引下线、接地装置(当然,这里面也有很多的细节和要求,也是需要专业人员来从事的,在此就不展开了),所以对直击雷的防…

springCloud使用maven

springCloud项目使用maven集成nexus 一:故事背景二:基础概念2.1 什么是Maven2.2 什么是nexus 三:实操3.1 setting文件配置3.2 项目内pom.xml配置3.3 jar上传3.3.1 maven插件上传3.3.2 mvn命令上传3.3.3 页面上传3.3.4 通过Rest的方式进行上传…

c++之到底什么时候需要加入析构函数定义?以及内存泄漏

析构函数(destructor)是在类对象销毁时自动调用的特殊成员函数。它的主要作用是释放对象的资源,如堆内存、文件、网络连接等。析构函数的特点是: 1. 析构函数名称与类名相同,前面加~。如~MyClass()。 2. 析构函数没有返回类型。 3. 析构函数可以重载,但不能有参数。 4. 一个…

2023年认证杯二阶段C题数据合并python以及matlab多途径实现代码

对于每种心率下给出的数据,我们需要进行合并才能方便后续处理,这里为大家展示利用python以及matlab分别实现合并的代码 import pandas as pd import os# 创建一个空的DataFrame对象 merged_data pd.DataFrame()# 设置数据文件所在的文件夹路径 folder_…

本地编译和交叉编译的理解

1、本地编译:常见的软件开发,都是属于本地编译:在当前的PC下,x86的CPU下,直接编译出来程序,可以运行的程序(或者库文件),其可以直接在当前的环境,即x86的CPU下…

【linux】挖矿病毒nanominer伪装成python占用服务器GPU!本文带你分析并杀毒!

病毒表现 gpustat -cpu 可以看到root用户将GPU的核心跑满了每个占用都是100%,显存吃了6G多。 nvidia-smi 不能正常显示GPU被哪些进程占用 ![在这里插入图片描述](https://img-blog.csdnimg.cn/780f90080a084a44ac59227e384f985b.png 病毒文件分析 在/tmp/.x/…

浅比一下,各大免费CDN的速度

前言 CDN那么多,到底哪个体验最好呢?今天来简单对比一下免费的CDN之间的差距,看看那家最适合白嫖 百度CDN 官网:https://su.baidu.com/ 平均速度62.7ms,需要备案的域名才行,支持SSL,流量5G/天…

Spring 整合 Mybatis -- Spring入门保姆级教程(四)

文章目录 前言五、Spring 整合 Mybatis1.Mybatis一般开发流程2.spring整合mybatis思路分析3.Spring整合Mybatis环境准备(注解开发)4.Spring整合Mybatis5.小结 引用网站及博客总结 前言 为了巩固所学的知识,作者尝试着开始发布一些学习笔记类…

​AI + 非遗文化传播,人工智能师资培训重磅招募

大语言模型热度空前,诸如文心一言、 ChatGPT 等已经能够与人对话互动、回答问题、协助创作,逐渐应用于人们的工作和生活,也引发了社会热议。为推动大模型及人工智能相关专业人员的培养,同时将人工智能技术融入非遗文化传播&#x…

电子采购系统实现方式(SRM供应商管理)

企事业数字化转型专家,提供各类应用解决方案。您身边的赋能小助手! 文章目录 前言一、当下采购的痛点二、解决方案-供应商管理1.供应商管理 三、解决方案-企业询价、供应商报价管理四、解决方案-采购订单五、送货、到货、订单管理总结 前言 随着各类产业…

软件工程(五) 结构化需求与面向对象需求分析

1、结构化需求分析(SA) 结构化需求分析要完成功能模型、数据模型和行为模型的构建。 1.1、功能模型 一般用数据流图进行建模,也就是DFD。 比如我们要开发一个子啊先教育平台系统,我们把这个系统看作一个整体,去分析哪些人员会用到这个系统。比如有学员,培训部,辅导老师…

阿里云、腾讯云、移动云飙“价”:智能普惠成新风向?

经过过去一年的“低迷”境况之后,2023年云服务商因为AI大模型的爆发,重新燃起了斗志。站在当下的时间节点,云服务商们也在重新思考如何在新形势下,让自己占据更大的优势,于是一场围绕“技术竞争与市场争夺”的新战争打…

spring boot 项目yml方式区分开发、测试生产,并在maven中配置

1、新建配置文件,分别为application.yml、application-dev.yml、application-test.yml和application-prod.yml 2、在application.yml文件中添加如下代码 spring:profiles:## ??pom???????profile??active: "profiles.active"3、在pom中的proj…

class生命周期

组件实例 化的过程称作组件的挂载(mount)。 组件挂载的过程: 构造函数(constructor)最先执行,componentWillMount() 会在 render() 方法之前 执行,而 componentDidMount() 在 render() 方法之后执行。组件更新,调用顺序如下: • componentWi…

为什么 PostQuitMessage 会被设计出来?

众所周知,我们可以使用 SendMessage 或者 PostMessage 来发送消息,那为什么在 Win32 API 中,会单独设计一个 PostQuitMessage 呢? 有一位读者 A. Skrobov 问我,”PostQuitMessage 和 PostThreadMessage(GetCurrentThreadId, WM_…