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编码,避免乱码问题。

