Golang处理CSV文件时的字符写入问题

Golang处理CSV文件时的字符写入问题 我正在从REST接口读取数据,然后将数据写入CSV文件。 数据包含特殊字符,这些字符在CSV文件中显示正确,但当打开CSV文件时,字符显示不正确。

类似“č,ć,š,ž”这样的字符 我的代码:

writer := csv.NewWriter(file)
defer writer.Flush()
writer.UseCRLF = true
err := writer.Write(value)

谢谢!

8 回复

我不太确定这个问题,但听起来像是您那边的 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编码打开文件。

回到顶部