Я пробовал это долгое время теперь, но не могу понять это. Я пытаюсь экспортировать данные в Excel через *.csv файл. Это работает отлично до сих пор, но у меня есть некоторые проблемы кодирования при открытии файлов в Excel.
(исходная строка слева, результат 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)")));
и так далее
Целый исходный код для метода, создающего данные:
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;
Это решение написано как исправление для приложения Java, однако вы должны иметь возможность делать что-то подобное на C #. Вы также можете посмотреть документацию по классу StreamWriter , в примечаниях он относится к метке порядка байтов (BOM).
Я бы посоветовал вам открыть текстовый файл в шестнадцатеричном редакторе и посмотреть, что это на самом деле. Спецификация для UTF-16 - это 0xFEFF, который код записи, по-видимому, записывает в поток, но остальная часть записи не указывает кодировку для использования - она будет использовать кодировку по умолчанию StreamWriter, которая является UTF-8. . Похоже, что это смешанные кодировки.
Если при открытии файла в шестнадцатеричном представлении вы видите много знаков 0x00 между символами, вы работаете с UTF-16, который в C # является Encoding.Unicode. Если между символами нет 0x00, вероятно, используется кодировка UTF-8.
В последнем случае просто исправьте спецификацию EF BB BF
, а не FE FF
, и читайте в обычном режиме с кодировкой UTF-8.
«ANSI as UTF8» (WTF?)
NotePad ++, вероятно, правильный. Кодировка - UTF8 (т.е. правильный заголовок Unicode), но содержит только данные ANSI (т.е. é не кодируется правильным образом UTF8, что означает два байта).
Или: наоборот. Это ANSI (без спецификации заголовка файла), но кодировка отдельных символов является или выглядит как UTF8. Это объяснило бы, что ü и другие символы расширяются более чем в одном символе. Вы можете исправить это, заставив файл считываться как Unicode.
Если возможно опубликовать (часть) вашего CSV-файла, мы можем помочь исправить его в источнике.
Теперь, когда мы увидели ваш код: можете ли вы удалить StreamWriter и заменить его TextWriter? Также удалите ручное кодирование спецификации, в этом нет необходимости. Когда вы создаете TextWriter, вы можете указать кодировку (не используйте ASCII, попробуйте UTF8).
попробуйте следующее:
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.