使用C#创建的UTF-8 CSV文件显示Excel中的字符

nim*_*bit 6 .net c# csv excel utf-8

当使用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(); 
Run Code Online (Sandbox Code Playgroud)

在Excel中打开CSV文件时,我仍然在£符号前面看到"Â"字符(十六进制等效\ xC2\xA3); 它没有任何区别.

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

nim*_*bit 8

谢谢@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
Run Code Online (Sandbox Code Playgroud)

至:

StreamWriter outputFile = new StreamWriter("testoutput.csv", false, new UTF8Encoding(true))
Run Code Online (Sandbox Code Playgroud)

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

StreamWriter outputFile = new StreamWriter("testoutput.csv", false, Encoding.GetEncoding("Windows-1252"))
Run Code Online (Sandbox Code Playgroud)

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

最终代码

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