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

我已经尝试了很长一段时间,但无法弄清楚。 我试图通过* .csv文件将数据导出到Excel。 到目前为止效果很好,但在Excel中打开文件时遇到一些编码问题。

(左边的原始string,右边的EXCEL结果):

Messwert(µm / m) ==> Messwert(µm / m) Dümme Mässöng ==> Dümme Mässöng 

记事本+ +告诉我,该文件编码“ANSI为UTF8”(WTF?)

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

 tWriter.Write(";Messwert(µm /m)"); 

更复杂的一个(尝试大概十几个或更多的编码组合:)

 tWriter.Write(Encoding.Default.GetString(Encoding.Unicode.GetBytes(";Messwert(µm /m)"))); tWriter.Write(Encoding.ASCII.GetString(Encoding.Unicode.GetBytes(";Messwert(µm /m)"))); 

等等

创build数据的方法的整个源代码:

  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; 

生成的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; 

这个解决scheme是作为一个Java应用程序的修复而写的,但是你应该可以在C#中做类似的事情。 您可能还需要查看StreamWriter类中的文档,其中引用了字节顺序标记(BOM)。

这对我来说是完美的:

 private const int WIN_1252_CP = 1252; // Windows ANSI codepage 1252 this._writer = new StreamWriter(fileName, false, Encoding.GetEncoding(WIN_1252_CP)); 

CSV编码问题(Microsoft Excel)

尝试以下方法:

 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); } 

在写入UTF8编码的CSV之前,它将适当的UTF8前导码写入文件。

“ANSI as UTF8”(WTF?)

NotePad ++可能是正确的。 编码是UTF8(即,正确的Unicode标头),但只包含ANSI数据(即,é没有以正确的UTF8方式编码,这意味着两个字节)。

或者:这是相反的。 它是ANSI(没有文件头BOM),但是单个字符的编码是或者看起来像UTF8。 这将解释ü和其他字符扩展在一个以上的其他字符。 你可以通过强制文件读取为Unicode来解决这个问题。

如果可以发布(部分)您的CSV,我们可能可以帮助解决它的来源。

编辑

现在我们已经看到了您的代码:您可以删除StreamWriter并将其replace为TextWriter吗? 此外,删除手工编码的BOM,这是没有必要的。 在创buildTextWriter时,可以指定编码(不要使用ASCII,请尝试使用UTF8)。

我build议你在hex编辑器中打开文本文件,看看它是什么。 UTF-16的BOM是0xFEFF,写入代码显然是写入stream – 但是其余的写入没有指定要使用的编码 – 它将使用StreamWriter的默认编码,即UTF-8 。 似乎有编码的混合。

当你在hex视图中popup打开文件时,如果在字符之间看到大量的0x00,那么你就使用UTF-16编码,它是C#中的Encoding.Unicode。 如果字符之间不存在0x00,则编码可能是UTF-8。

如果是后一种情况,只需将BOM固定为EF BB BF而不是FE FF ,然后使用UTF-8编码正常读取。

Trevor Germain帮助我保存了正确的编码格式

 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); 

}

对于使用StreamWriter的我的场景,我发现明确地将UTF8编码传递给启用了StreamWriter的Excel,以使用正确的编码读取文件。

有关更多详细信息,请参阅此答案: https : //stackoverflow.com/a/22306937/999048