2010-03-15 49 views
3

我導出數據的表,CSV格式,如:ASP.NET CSV Excel中的問題與奇怪的字符

"COL1","COL2","COL3" 
    "1","some text", "£232.00" 
    "2","some more text", "£111.00" 
    "3","other text", "£2.00" 

出口的代碼是相當簡單的使用ashx的處理程序:

context.Response.Clear() 
    context.Response.ContentType = "text/csv" 
    context.Response.AddHeader("Content-disposition", "attachment;filename=data.csv") 
    context.Response.AddHeader("Cache-Control", "must-revalidate") 
    context.Response.AddHeader("Pragma", "must-revalidate") 
    context.Response.Write(data) 
    context.Response.Flush() 
    context.Response.End() 

我的問題是當Excel試圖打開導出的文件時,字符Â出現在所有£符號之前,例如£232.00當值應該是£232.00

+1

這看起來像一個Unicode到UTF-8的翻譯錯誤。不過,我不知道如何修復它。 – 2010-03-15 18:55:55

回答

5

您需要設置編碼,即Response.ContentEncoding屬性。

後終於在反射看這件事,默認ContentEncoding很可能是Encoding.DefaultEncoding.UTF8,如果​​配置部分存在,除非它是通過在配置部分中的responseEncoding屬性覆蓋。

至於是否有區別地設置都進行了ContentEncoding屬性不這樣做:

  • 如果你把它設置爲同一個對象作爲其當前設置,它明確地捕捉那和什麼也不做;
  • 但是,如果您更改設置,它會調用HttpWriter.UpdateResponseEncoding,如果有任何緩衝區已經寫入,則在切換到新編碼之前調用HttpWriter.FlushCharBuffer
  • 如果不設置ContentEncoding它設置爲我上面提到的,首先參考HttpWriter.UpdateResponseEncoding默認,因爲HttpWriter._responseEncodingUpdated在寫作方法檢查,只有在年底更新True寫任何內容之前這絕對稱得上HttpWriter.UpdateResponseEncoding

因此,我認爲需要改變編碼Unicode的OP,我認爲菲爾·黑爾的評論意味着他有這樣的需要壓倒一切的一個​​配置部分。

注:

  • 現有的代碼中調用Response.Clear僅影響內容,而不是標題,那麼,違背了我以前的建議,我相信這是相關的,除刪除現有的任何機會內容將在ContentEncoding更改之前被刷新。
  • 這是基於來自.NET Framework 2.0的System.Web的Reflector 6輸出。
+1

感謝您解決這個問題的提示 「context.Response.ContentEncoding = System.Text.Encoding.Unicode」 – user23048345 2010-03-16 12:03:48

+3

我通過添加'Response.ContentEncoding = Encoding.Default;'來解決這個問題。不太清楚爲什麼這是誠實的 – 2013-03-06 15:35:21

0

這爲我工作 - 別人沒有

Response.ContentEncoding = System.Text.Encoding.Default