这里讨论的问题是,当用记事本打开带有中文字符的csv正常时,用excel打开却是乱码。
简单概括就是:编码问题,windows的 excel打开csv文本文件时,默认使用的是系统内的ANSI,在中文环境下就是GB2312。如果写文件时,用的编码格式是UTF-8那么excel用GB2312打开肯定是乱码。
一般两种方法,在文件创建时指定让Excel默认打开不乱码的编码,或者加BOM 标记(Byte Order Mark 字节顺序标记),让excel用指定的编码打开。
所以解决的思路就很清晰:
1.使用GB2312,gbk,gb18030这类windows下中文默认的编码。
2.使用utf-8-sig即在文件头写入 0xEF、0xBB、0xBF,让excel识别出这是utf-8编码,用utf-8编码打开csv文件。
实例:
python 写csv文件时指定编码格式,如gb2312,gbk,gb18030,python的csv包不需要再文件头写入0xEF、0xBB、0xBF,直接指定utf-8-sig就可以。
with open('file.csv', 'w', newline='', encoding='gb18030', mode='wb') as file:
writer = csv.writer(file)
# 写入数据到CSV文件
如果是数据流返回,可以指定编码格式
"Content-Type": "application/octet-stream; charset=utf-8-sig"
写入utf-bom的csv
没有bom的utf
go 在文件头写入 BOM
func generateCSV(data [][]string) []byte {
var buffer bytes.Buffer
writer := csv.NewWriter(&buffer)
for index, row := range data {
if index == 0 {
if len(row) > 0 {
// 写入 UTF-8 BOM让excel自己识别csv
row[0] = "\xEF\xBB\xBF" + row[0]
}
}
writer.Write(row)
}
writer.Flush()
return buffer.Bytes()
}
参考:
Windows 记事本的 ANSI、Unicode、UTF-8 这三种编码模式有什么区别? - 知乎
ASCII、GB2312、GBK、GB18030、Unicode、UTF-8、BIG5 编码分析_gb18030和gbk-CSDN博客
csv 文件打开乱码,有哪些方法可以解决? - 知乎
encoding - Microsoft Excel mangles Diacritics in .csv files? - Stack Overflow