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