2015-06-03 4 views
0

У меня есть проект ASP.net и вы хотите вернуть CSV-файл, когда отправляется сообщение AJAX (да, это работает. См. Handle file download from AJAX post). Особо то, что я хочу создать результат в MemoryStream, чтобы вернуть его как FileResult. Но моя проблема в том, что немецкие умляуты (ä, ö, ü) испорчены. Итак, вот мой код:Запись строки в MemoryStream развращает ввод

public ActionResult Download(FormCollection form) { 
string[] v = new string[16]; 
MemoryStream stream = new MemoryStream(); 
StreamWriter writer = new StreamWriter(stream, 
    System.Text.Encoding.GetEncoding("Windows-1252")); 
SqlCommand cmd = dbconn.CreateCommand(); 
//create SQL command 
while (rs.Read()) { 
    v = new string[16]; 
    v[0] = rs.GetString("IstAktiv"); 
    v[1] = rs.GetString("Haus"); 
    //cache all the values 
    ... 
    //write cached values 
    for (int i = 0; i < v.Length; i++) { 
    if (i > 0) writer.Write(";"); 
    writer.Write(v[i]); 
    writer.Flush(); 
    } 
    writer.Write("\r\n"); 
    writer.Flush(); 
} //end while rs.Read() 

FileContentResult ret = new FileContentResult(stream.ToArray(), "text/csv"); 
ret.FileDownloadName = "Kontakte.csv"; 
writer.Close(); 
return ret; 
} //end method 

Итак, когда я открываю полученный файл в Excel, умлауты преобразуются во что-то странное. Например, буква верхнего регистра «Ä» заменяется на « ». Так есть ли возможность решить эту проблему?

С наилучшими пожеланиями

+0

Вы пробовали с различными кодировками? – GeorgeChond

+0

'//System.Text.Encoding.GetEncoding("UTF-8") // */ //System.Text.Encoding.GetEncoding(1141) // */ //System.Text.Encoding.Unicode //System.Text.Encoding.GetEncoding («Windows-1250») ' да, это были другие кодировки, я пробовал. Я получил лучший результат с UTF-8. При открытии файла в нормальном блокноте все было в порядке, но когда я открыл тот же файл в Excel, умляуты были повреждены в любом случае. Поэтому я сохраняю файл в блокноте как ANSI-кодированный файл, и даже Excel может отображать umlauts, как и должно быть –

+0

Можете ли вы попробовать с System.Text.Encoding.GetEncoding (850)? – GeorgeChond

ответ

1

Чтобы Excel правильно прочитать CSV-файлы, ожидает, что файл CSV, чтобы быть в кодировке UTF-8 (с BOM).

Так, без сомнения, ваш StreamWriter бы установить таким образом:

StreamWriter writer = new StreamWriter(stream, 
    System.Text.Encoding.GetEncoding("UTF-8")); 

Однако, если это не работает для вас, то это весьма вероятно, что это потому, что символы коррумпируется до у вас даже есть шанс записать их в поток. Вы можете столкнуться с проблемой преобразования кодировки при чтении данных из базы данных.

v = new string[16]; 
v[0] = rs.GetString("IstAktiv"); 
v[1] = rs.GetString("Haus"); 

Чтобы проверить это, поместите контрольную точку, как вы читать значения в массив «V», и проверить, что символы по-прежнему выглядит хорошо на этом шаге. Если они повреждены, то вы знаете, что проблема между кодом и базой данных, и запись в CSV не является проблемой.

EDIT: Вот изолированный тестовый пример, который вы можете использовать, чтобы доказать, что UTF-8 является правильным кодированием для записи CSV. Возможно, вы можете попробовать это первым:

Encoding enc = Encoding.GetEncoding("UTF-8"); 
using (StreamWriter writer = new StreamWriter(@"d:\test\test.csv", false, enc)) 
{ 
    writer.Write(@"""hello ä, ö, ü world"""); 
} 
+0

Я установил точку останова, и данные, записанные в массивы значений 'v', были правильными. –

+1

Вам не нужно создавать новую кодировку UTF8, она доступна как статическое свойство, [Encoding.UTF8] (https://msdn.microsoft.com/en-us/library/system.text.encoding.utf8% 28v = vs.110% 29.aspx) –

+0

@Mecki Matschbirne: Я рекомендую вам написать отдельный тестовый сценарий, в котором вы прямо записываете значения в поток, не читая из базы данных. Это то, что я только что сделал, используя персонажей, которые вы упоминаете. И единственный способ заставить их правильно открыть Excel, - это убедиться, что CSV находится в формате UTF-8 (с BOM). Можете ли вы попробовать это и сообщить нам, какие результаты вы получите? – sstan

Смежные вопросы