将字符串写入MemoryStream会破坏输入

时间:2015-06-03 11:43:47

标签: c# asp.net-mvc

我有一个ASP.net项目,想要在发送AJAX帖子时返回一个CSV文件(是的,它是有效的。请参阅Handle file download from AJAX post)。 特别的是,我想在MemoryStream中创建结果以将其作为FileResult返回。 但我现在的问题是,德国变音符号(ä,ö,ü)被破坏了。所以这是我的代码:

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中打开生成的文件时,变音符号将转换为奇怪的内容。例如,大写字母“Ä”改为“ ”。 那么有没有可能解决这个问题呢?

祝你好运

1 个答案:

答案 0 :(得分: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不是问题。

编辑:这是一个独立的测试用例,可用于证明UTF-8是写入CSV的正确编码。也许你可以先尝试一下:

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