You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Golang编写UTF-16编码CSV遇乱码问题求助

解决Go编写UTF-16编码CSV文件的乱码问题

你的问题出在错误地单独编码字符串后再交给csv.Writer处理:csv.Writer默认会把输入的字符串当作UTF-8直接写入文件,而你先把字符串转成了UTF-16编码的字节序列,这些字节被当作UTF-8解析时就会出现乱码。

正确的做法是给文件Writer套上UTF-16编码器,让csv.Writer的输出自动被编码为UTF-16,而不是手动转换字符串。修正后的代码如下:

package main

import (
    "encoding/csv"
    "os"

    "golang.org/x/text/encoding/unicode"
)

func main() {
    csvFile, err := os.Create("test.csv")
    if err != nil {
        panic(err)
    }
    defer csvFile.Close()

    // 用UTF-16LE编码器包装文件Writer,添加BOM
    utf16Writer := unicode.UTF16(unicode.LittleEndian, unicode.UseBOM).NewEncoder().Writer(csvFile)
    csvWriter := csv.NewWriter(utf16Writer)
    defer csvWriter.Flush()

    message := "weird characters: дгодг"
    // 直接写入原始UTF-8字符串,编码器会自动转成UTF-16
    if err := csvWriter.Write([]string{message}); err != nil {
        panic(err)
    }
    if err := csvWriter.Write([]string{message}); err != nil {
        panic(err)
    }
}

关键修正点

  • 不再手动转换字符串编码,而是通过unicode.UTF16(...).NewEncoder().Writer()将文件Writer包装成UTF-16LE编码的输出流。
  • csv.Writer直接写入原始的UTF-8字符串,所有内容会通过编码器自动转换为UTF-16LE编码,同时文件开头会自动添加UTF-16LE的BOM(字节顺序标记),确保编辑器能正确识别编码。

这样生成的CSV文件会是标准的UTF-16LE编码,打开后不会出现乱码。

内容的提问来源于stack exchange,提问作者None

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 03:48:36