2012-03-02 60 views
1

我使用下一個代碼從我的日誌表中生成.csv文件。西里爾字符的csv文件編碼

public ActionResult Index() 
{ 
var records = loggingService.GetLogRecords(model.Since, model.For); 

var mainSb = new StringBuilder(); 
mainSb.Append("Date,User name\n"); 

foreach (var logRecord in records) 
{ 
    mainSb.Append(logRecord.Time.ToString("dd/MM/yyyy hh:mm:ss")).Append(","); 
    mainSb.Append("\"").Append(logRecord.UserName ?? "").Append("\"").Append(","); 
} 
return File(Encoding.Unicode.GetBytes(mainSb.ToString()), "text/csv", string.Format("logs.csv")); 
} 

用戶名包含西里爾字符,當我打開我的.csv文件 - 西里爾字符顯示不正確。我試圖使用UTF8和UTF32編碼。我應該使用Whan編碼還是應該做什麼改變?

回答

12

你可以在前導碼中使用UTF-8。試着這樣結尾:

var data = Encoding.UTF8.GetBytes(mainSb.ToString()); 
var result = Encoding.UTF8.GetPreamble().Concat(data).ToArray(); 
return File(result, "text/csv", "logs.csv"); 

而且你似乎可以用\n這是不是在Windows上正確的新行分隔符,你似乎並不在你的foreach循環被追加新的生產線,所以一切會在同一行上導致無效的CSV文件。請,請,do not roll your own CSV parser

+0

對於字符串進行編碼,我從他們中刪除字符','和'''是否夠用嗎?可以幫助您鏈接回答幫助生成(不解析).csv文件嗎? – 2012-03-04 20:14:04

+0

非常好的答案,謝謝你提到這個。我只是成功地使用它來讓斯堪的納維亞人物也能工作。 – MEMark 2013-10-05 10:04:20