使用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
相关产品推荐
相关产品推荐

