Golang如何写入带BOM的UTF-8格式CSV文件?

Golang如何写入带BOM的UTF-8格式CSV文件? 我正在使用 encoding/csv 在 Mac 上创建 CSV 文件,但当我把文件发送给使用 Windows 的人时,内容显示为乱码。我查找了原因,发现需要写入 UTF-8 BOM 头,但这个方法没有生效。

以下是我的代码:

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

func main() {
	file, err := os.Create("result.csv")
	if err != nil {
		log.Println(`create file error:`, err)
		return
	}
	defer file.Close()
	writer := csv.NewWriter(file)
	bomUtf8 := []byte{0xEF, 0xBB, 0xBF}
	writer.Write([]string{string(bomUtf8[:])})
	writer.Write([]string{`当日资金净流入前十名币种`})
	writer.Flush()
}

更多关于Golang如何写入带BOM的UTF-8格式CSV文件?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

你需要直接将BOM写入文件:file.Write(bomUtf8),然后使用该写入器来处理CSV数据。

请务必检查file.Write和writer.Write(以及Flush)的错误信息!

func main() {
    fmt.Println("hello world")
}

更多关于Golang如何写入带BOM的UTF-8格式CSV文件?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,使用encoding/csv包写入带BOM的UTF-8 CSV文件时,需要先将BOM字节直接写入文件,然后再创建CSV写入器。您当前的代码将BOM作为CSV记录写入,这会导致BOM被当作普通文本内容处理,而不是文件头标识。

以下是正确的实现方式:

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

func main() {
	file, err := os.Create("result.csv")
	if err != nil {
		log.Println("create file error:", err)
		return
	}
	defer file.Close()

	// 先写入UTF-8 BOM
	bomUtf8 := []byte{0xEF, 0xBB, 0xBF}
	_, err = file.Write(bomUtf8)
	if err != nil {
		log.Println("write BOM error:", err)
		return
	}

	// 然后创建CSV写入器
	writer := csv.NewWriter(file)
	
	// 写入CSV数据
	err = writer.Write([]string{"当日资金净流入前十名币种"})
	if err != nil {
		log.Println("write CSV error:", err)
		return
	}
	
	writer.Flush()
	
	// 检查Flush错误
	if err := writer.Error(); err != nil {
		log.Println("flush error:", err)
		return
	}
}

如果需要写入多行数据,可以这样扩展:

func main() {
	file, err := os.Create("result.csv")
	if err != nil {
		log.Println("create file error:", err)
		return
	}
	defer file.Close()

	// 写入BOM
	bomUtf8 := []byte{0xEF, 0xBB, 0xBF}
	_, err = file.Write(bomUtf8)
	if err != nil {
		log.Println("write BOM error:", err)
		return
	}

	writer := csv.NewWriter(file)
	
	// 写入表头
	headers := []string{"排名", "币种", "净流入金额"}
	err = writer.Write(headers)
	if err != nil {
		log.Println("write headers error:", err)
		return
	}
	
	// 写入数据行
	data := [][]string{
		{"1", "BTC", "1000000"},
		{"2", "ETH", "800000"},
		{"3", "BNB", "600000"},
	}
	
	for _, record := range data {
		err = writer.Write(record)
		if err != nil {
			log.Println("write record error:", err)
			return
		}
	}
	
	writer.Flush()
	if err := writer.Error(); err != nil {
		log.Println("flush error:", err)
		return
	}
}

关键区别在于:BOM字节需要直接写入文件流,而不是通过CSV写入器作为字符串记录写入。这样生成的CSV文件在Windows系统上就能正确识别UTF-8编码,避免乱码问题。

回到顶部