c#,Excel + csv:如何获得正确的编码?

yas*_*891 13 c# csv excel encoding export

我现在已经尝试了很长一段时间,但无法弄明白.我正在尝试通过*.csv文件将数据导出到Excel.它到目前为止工作得很好,但在Excel中打开文件时遇到了一些编码问题.

(左边的原始字符串,右边的EXCEL结果):

Messwert(µm / m) ==> Messwert(µm / m)

Dümme Mässöng ==> Dümme Mässöng
Run Code Online (Sandbox Code Playgroud)

Notepad ++告诉我该文件被编码为"ANSI as UTF8"(WTF?)

所以这里有不同的方法我试图得到一个有效的结果:明显的实现:

tWriter.Write(";Messwert(µm /m)");
Run Code Online (Sandbox Code Playgroud)

更复杂的一个(试过可能十几个或更多的编码组合:)

tWriter.Write(Encoding.Default.GetString(Encoding.Unicode.GetBytes(";Messwert(µm /m)")));
tWriter.Write(Encoding.ASCII.GetString(Encoding.Unicode.GetBytes(";Messwert(µm /m)")));
Run Code Online (Sandbox Code Playgroud)

等等

创建数据的方法的完整源代码:

    MemoryStream tStream = new MemoryStream();
    StreamWriter tWriter = new StreamWriter(tStream);
    tWriter.Write("\uFEFF");

    tWriter.WriteLine(string.Format("{0}", aMeasurement.Name));
    tWriter.WriteLine(aMeasurement.Comment);
    tWriter.WriteLine();
    tWriter.WriteLine("Zeit in Minuten;Messwert(µm / m)");

    TimeSpan tSpan;
    foreach (IMeasuringPoint tPoint in aMeasurement)
    {
        tSpan = new TimeSpan(tPoint.Time - aMeasurement[0].Time);
        tWriter.WriteLine(string.Format("{0};{1};", (int)tSpan.TotalMinutes, getMPString(tPoint)));
    }

    tWriter.Flush();
    return tStream;
Run Code Online (Sandbox Code Playgroud)

生成的CSV文件:

Dümme Mössäng
Testmessung die erste

Zeit in Minuten;Messwert(µm / m)
0;-703;
0;-381;
1;1039;
1;1045;
2;1457;
2;1045;
Run Code Online (Sandbox Code Playgroud)

Ken*_*son 8

解决方案是作为Java应用程序的修复程序编写的,但您应该能够在C#中执行类似的操作.您可能还想查看StreamWriter类的文档,在它引用字节顺序标记(BOM)的备注中.


Fer*_* JS 7

这对我来说很完美:

private const int WIN_1252_CP = 1252; // Windows ANSI codepage 1252

    this._writer = new StreamWriter(fileName, false, Encoding.GetEncoding(WIN_1252_CP));
Run Code Online (Sandbox Code Playgroud)

CSV编码问题(Microsoft Excel)


小智 6

尝试以下方法:

using (var sw = File.Create(Path.Combine(txtPath.Text, "UTF8.csv")))
{
  var preamble = Encoding.UTF8.GetPreamble();
  sw.Write(preamble, 0, preamble.Length);
  var data = Encoding.UTF8.GetBytes("??,\"Hello\",text");
  sw.Write(data, 0, data.Length);
}
Run Code Online (Sandbox Code Playgroud)

在写入UTF8编码的CSV之前,它会将正确的UTF8前导码写入文件.