【问题标题】:UTF-8 CSV file created with C# shows  characters in Excel使用 C# 创建的 UTF-8 CSV 文件在 Excel 中显示字符
【发布时间】:2018-07-26 00:30:07
【问题描述】:

当使用 C# 生成 CSV 文件并在 Microsoft Excel 中打开时,它会在特殊符号之前显示 Â 字符,例如英镑

在 Notepad++ 中, 的十六进制值为:C2

所以在将 £ 符号写入文件之前,我尝试了以下操作...

    var test = "£200.00";
    var replaced = test.Replace("\xC2", " ");

    StreamWriter outputFile = File.CreateText("testoutput.csv"); // default UTF-8
    outputFile.WriteLine(replaced);
    outputFile.Close(); 

在 Excel 中打开 CSV 文件时,我仍然看到 £ 符号前的“”字符(相当于十六进制 \xC2 \xA3);没什么区别。

我需要使用不同的编码吗?还是我错过了什么?

【问题讨论】:

  • 你读过这个问题了吗:stackoverflow.com/q/6002256/5311735
  • 谢谢@Evk。不幸的是,那个特定的帖子没有回答这个问题,因为我无法控制客户端的 Excel 配置。 CSV 也是使用 .NET 代码生成的。我想解析 CSV 输出,以便它可以在任何机器上运行。
  • 嗯,这个问题有很多答案,接受的一个实际上根本没有答案,所以看看其他的。
  • 感谢@Evk,我正在查看每条建议,如果找到解决方案,我会更新帖子
  • 您可能需要提及您所针对的 Excel 版本。有些人有一些真的旧版本。

标签: c# .net excel csv utf-8


【解决方案1】:

感谢@Evk 和@Mortalier,您的建议将我引向正确的方向...

我需要更新我的 StreamWriter,以便它在开头明确包含 UTF-8 BOM http://thinkinginsoftware.blogspot.co.uk/2017/12/correctly-generate-csv-that-excel-can.html

所以我的代码已经从:

StreamWriter outputFile = File.CreateText("testoutput.csv"); // default UTF-8

收件人:

StreamWriter outputFile = new StreamWriter("testoutput.csv", false, new UTF8Encoding(true))

或者:我在这里找到的另一个解决方案是,如果您只期望拉丁字符,则使用不同的编码...... http://theoldsewingfactory.com/2010/12/05/saving-csv-files-in-utf8-creates-a-characters-in-excel/

StreamWriter outputFile = new StreamWriter("testoutput.csv", false, Encoding.GetEncoding("Windows-1252"))

我的系统很可能会使用拉丁和非拉丁字符,所以我使用的是 UTF-8 BOM 解决方案。

最终代码

    var test = "£200.00";
    StreamWriter outputFile = new StreamWriter("testoutput.csv", false, new UTF8Encoding(true))
    outputFile.WriteLine(test);
    outputFile.Close();

【讨论】:

  • 您依靠 Excel 来猜测编码。当前几个字节看起来像 BOM 时,它会通过选择相应的 Unicode 编码来进行猜测。打开文本文件的规范方法是为程序提供编码,在 CSV 的情况下,还提供标题、列类型、字段分隔符、文本限定符和转义信息。 Excel 通过其文本导入对话框支持所有这些。 (当然,如果您使用像 xlsx 这样嵌入了所有元数据的文件类型,则用户不必单独提供它。使用免费的开源库在 C# 中创建 xlsx 文件非常容易。)
【解决方案2】:

我尝试了您的代码,Excel 确实在单元格中显示了 AŁ。 然后我尝试用 LibreOffice Clac 打开 csv。起初也有 AŁ,但 导入时,程序会询问您有关编码的问题。 一旦我选择了 UTF-8,£ 符号就会正确显示。 我的猜测是,实际上您的编码存在问题。

这可能有助于 Excel https://superuser.com/questions/280603/how-to-set-character-encoding-when-opening-excel

【讨论】:

  • 感谢您的回复 Mortaliar,但是我无法控制客户端的 Excel 配置并设置默认值,因为它们是由他们的组织策略设置的。该问题仅在使用代码生成时才会出现。如果它是在记事本或任何其他应用程序中手动创建的,则不会发生。我怀疑它与流编写器有关,所以我想从代码的角度解决这个问题。从代码的角度来看,您对我可能出错的地方有任何想法吗?
  • 谢谢你,我正在检查这个:)
猜你喜欢
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-23
  • 2011-06-23
相关资源
最近更新 更多