c#, Excel + csv: как получить корректное кодирование?

Я пробовал это долгое время теперь, но не могу понять это. Я пытаюсь экспортировать данные в 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;
13
задан AlexC 29 April 2013 в 14:28
поделиться

4 ответа

Это решение написано как исправление для приложения Java, однако вы должны иметь возможность делать что-то подобное на C #. Вы также можете посмотреть документацию по классу StreamWriter , в примечаниях он относится к метке порядка байтов (BOM).

8
ответ дан 1 December 2019 в 20:42
поделиться

Я бы посоветовал вам открыть текстовый файл в шестнадцатеричном редакторе и посмотреть, что это на самом деле. Спецификация для UTF-16 - это 0xFEFF, который код записи, по-видимому, записывает в поток, но остальная часть записи не указывает кодировку для использования - она ​​будет использовать кодировку по умолчанию StreamWriter, которая является UTF-8. . Похоже, что это смешанные кодировки.

Если при открытии файла в шестнадцатеричном представлении вы видите много знаков 0x00 между символами, вы работаете с UTF-16, который в C # является Encoding.Unicode. Если между символами нет 0x00, вероятно, используется кодировка UTF-8.

В последнем случае просто исправьте спецификацию EF BB BF , а не FE FF , и читайте в обычном режиме с кодировкой UTF-8.

2
ответ дан 1 December 2019 в 20:42
поделиться

«ANSI as UTF8» (WTF?)

NotePad ++, вероятно, правильный. Кодировка - UTF8 (т.е. правильный заголовок Unicode), но содержит только данные ANSI (т.е. é не кодируется правильным образом UTF8, что означает два байта).

Или: наоборот. Это ANSI (без спецификации заголовка файла), но кодировка отдельных символов является или выглядит как UTF8. Это объяснило бы, что ü и другие символы расширяются более чем в одном символе. Вы можете исправить это, заставив файл считываться как Unicode.

Если возможно опубликовать (часть) вашего CSV-файла, мы можем помочь исправить его в источнике.

Edit

Теперь, когда мы увидели ваш код: можете ли вы удалить StreamWriter и заменить его TextWriter? Также удалите ручное кодирование спецификации, в этом нет необходимости. Когда вы создаете TextWriter, вы можете указать кодировку (не используйте ASCII, попробуйте UTF8).

3
ответ дан 1 December 2019 в 20:42
поделиться

попробуйте следующее:

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.

6
ответ дан 1 December 2019 в 20:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: