Golang处理CSV文件时的字符写入问题
Golang处理CSV文件时的字符写入问题 我正在从REST接口读取数据,然后将数据写入CSV文件。 数据包含特殊字符,这些字符在CSV文件中显示正确,但当打开CSV文件时,字符显示不正确。
类似“č,ć,š,ž”这样的字符 我的代码:
writer := csv.NewWriter(file)
defer writer.Flush()
writer.UseCRLF = true
err := writer.Write(value)
谢谢!
我不太确定这个问题,但听起来像是您那边的 UTF-8 编码问题。这可能有助于您找到排查方向。
更多关于Golang处理CSV文件时的字符写入问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
读取此CSV文件的程序位于Windows服务器上。 运行Golang的操作系统是Linux(Docker -> Golang 1.8)
我们不清楚您的数据来源,可能它本身就是错误的格式?根据您读取和写入数据的方式,数据可能会被转换,但不一定……
因此,您需要展示更多代码,甚至可能是一个简化的输入示例。
抱歉,我不了解那个 API 或库。
请展示一个损坏示例的 fmt.Printf("%#v", []byte(item)) 表示,你期望看到的结果以及实际看到的结果。
我仍然认为你的数据源中的编码不是 UTF-8。
fmt.Printf("%#v", []byte(item))
miha: 读取该CSV文件的程序运行在Windows服务器上。
这是哪个程序?
它需要特定的编码格式吗?或者您能否调整编码以匹配Go输出的格式?
miha: (docker -> golang 1.8)
您可能需要升级版本。当前最新版本是1.11,而1.8可能已不被许多库支持。通常库只支持当前和上一个次要版本,这意味着:1.11和1.10。
问题出在Excel上。它默认使用错误的编码打开CSV文件。有三种解决方案:
1. 在Excel内部导入:https://support.office.com/en-us/article/text-import-wizard-c5b02af6-fda1-4440-899f-f78bafe41857?ui=en-US&rs=en-US&ad=US
2. 将扩展名改为.txt,右键单击并选择用Excel打开,然后Excel会显示相同的导入向导
3. 将文件转换为Excel会自动导入的格式。这是一个UTF16LE文件,首行是一个16位字0XFFFE,后跟"sep=\t\n",然后文件的其余部分使用UTF16LE(小端序)。也许你可以交换前两个字节并使用UTF16BE(大端序)
你好
我正在使用这个库:https://github.com/Genert/pipedrive-api/
result, _, err := client.Persons.List(context.Background())
然后使用以下代码保存:
func CsvGen(data [][]string) {
file, err := os.Create("result.csv")
checkError("Cannot create file", err)
defer file.Close()
writer := csv.NewWriter(file)
defer writer.Flush()
writer.UseCRLF = true
for _, value := range data {
// fmt.Println("before for:", len(value))
for {
if len(value) >= 5 {
break
} else {
value = append(value, "")
//fmt.Println(value)
}
//fmt.Println("izven loopa:", len(value))
}
err := writer.Write(value)
checkError("Cannot write to file", err)
}
}
问题出现在字符编码上。CSV文件默认使用UTF-8编码,但某些应用程序(如Excel)可能无法正确识别UTF-8编码的CSV文件。您需要在文件开头添加UTF-8 BOM(字节顺序标记),并确保文件以UTF-8编码保存。
以下是修改后的代码:
package main
import (
"encoding/csv"
"os"
)
func main() {
file, err := os.Create("output.csv")
if err != nil {
panic(err)
}
defer file.Close()
// 添加UTF-8 BOM
bom := []byte{0xEF, 0xBB, 0xBF}
if _, err := file.Write(bom); err != nil {
panic(err)
}
writer := csv.NewWriter(file)
defer writer.Flush()
writer.UseCRLF = true
// 示例数据包含特殊字符
data := [][]string{
{"č", "ć", "š", "ž"},
{"测试", "日本語", "한국어"},
}
for _, record := range data {
if err := writer.Write(record); err != nil {
panic(err)
}
}
}
如果您使用的是Windows系统,Excel可能还需要特定的区域设置才能正确显示这些字符。另一种解决方案是使用制表符分隔的文件(TSV)而不是CSV:
package main
import (
"encoding/csv"
"os"
)
func main() {
file, err := os.Create("output.tsv")
if err != nil {
panic(err)
}
defer file.Close()
// 添加UTF-8 BOM
bom := []byte{0xEF, 0xBB, 0xBF}
if _, err := file.Write(bom); err != nil {
panic(err)
}
writer := csv.NewWriter(file)
writer.Comma = '\t' // 使用制表符作为分隔符
defer writer.Flush()
data := [][]string{
{"č", "ć", "š", "ž"},
{"测试", "日本語", "한국어"},
}
for _, record := range data {
if err := writer.Write(record); err != nil {
panic(err)
}
}
}
如果问题仍然存在,请检查数据源是否确实使用UTF-8编码,并验证您的文本编辑器或电子表格应用程序是否配置为使用UTF-8编码打开文件。

