c#,Excel + csv:如何获得正确的编码? [英] c#, Excel + csv: how to get the correct encoding?

查看:862
本文介绍了c#,Excel + csv:如何获得正确的编码?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在尝试这个相当一段时间,但不能弄清楚。我试图通过* .csv文件导出数据到Excel。到目前为止,它工作得很好,但在Excel中打开文件时,我有一些编码问题。



(左边的原始字符串,右侧的EXCEL结果) p>

  Messwert(μm/ m)==> Messwert(Âμm/ m)

DümmeMässöng==> Notepad ++告诉我该文件被编码为ANSI as 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))));

等等。



对于创建数据的方法:

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

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ümmeMössäng
Testmessung die erste

Zeit in Minuten; Messwert(μm/ m)
0; -703;
0; -381;
1; 1039;
1; 1045;
2; 1457;
2; 1045;


解决方案

解决方案被写为Java应用程序的修订但是你应该能够在C#中做类似的事情。您还可以查看 StreamWriter 类,在注释中它指的是字节顺序标记(BOM)。


I've been trying this for quite a while now, but can't figure it out. I'm trying to export data to Excel via a *.csv file. It works great so far, but I have some encoding problems when opening the files in Excel.

(original string on the left, EXCEL result on the right):

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

Dümme Mässöng ==> Dümme Mässöng

Notepad++ tells me that the file is encoded "ANSI as UTF8"(WTF?)

So here are different ways I tried to get a valid result: obvious implementation:

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

more sophisticated one (tried probably a dozen or more encoding combinations:)

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

and so on

Whole source code for the method creating the data:

    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;

Generated CSV file:

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;

解决方案

This solution is written up as a fix for a Java application however you should be able to do something similar in C#. You may also want to look at the documentation on the StreamWriter class, in the remarks it refers to the Byte Order Mark (BOM).

这篇关于c#,Excel + csv:如何获得正确的编码?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆