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)
}
结果:
写入之后,用十六进制查看