關於我

我的相片
用心思考、保持熱情,把工作上的經驗作分享與紀錄。希望能夠跟大家一起不斷的成長~

Asp.net Response output file 中文編碼問題整理

輸出檔案的程式Encoding需注意:

  1. 輸出Encoding設定可分兩部分,Header部份與Content部份。
  2. 每個部份的Encoding均必須先設定,再寫入資料避免資料沒被設定到。 Ex:須先設定Response.HeaderEncoding,在Response.AddHeader(),否則設定會失效。
  3. 檔名如需使用中文,因檔名是寫在Header中,因此要設定Header為相對應Encoding。
  4. 檔案內容部份,則要將對應Encoding,設定於Content中。
  Response.ContentType = "application/vnd.ms-excel"; 

  //HeaderEncoding的設定,需將網站部署於IIS上,才可正確使用 
  //於ASP.NET Developermnet Server上測試會失效,可能是此環境沒正確處理HeaderEncoding! 
  //此處在寫入Header與Content資料前,便先早一步將Encoding設定完成,確保Encoding生效! 
  Response.HeaderEncoding = System.Text.Encoding.GetEncoding("utf-8"); 
  Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8"); 
  Response.AddHeader("content-disposition", "attachment;filename=我是中文(堃)XXX.xls"); 

  //因Content此處設定使用Utf-8格式,但Excel開啟時,可能會使用錯誤的編碼方式, 
  //因此特別在Content中,加入一行meta,用於讓Excel使用指定的編碼方式開啟! 
  Response.Write("<meta http-equiv=Content-Type content=text/html;charset=utf-8 />"); 
  Response.Write("<body><div>我是中文(中),我是難字(堃)</div></body>");      
Response.End();
上方會發現,Header的編碼,用的是big5 原因是各家瀏覽器讀取Header時,可用的編碼方式各不相同 各家瀏覽器讀取Header之編碼方式整理如下:
  • [  IE   ] 預設使用不支援中文的編碼方式讀取,中文則只支援使用big5
  • [FireFox] 預設使用utf-8讀取,中文同時支援big5與utf-8
  • [ Google] 預設使用utf-8讀取,中文只支援使用utf-8讀取

因此如需使用中文檔名,因FireFox與Google預設都是使用utf-8
因此不需特別指定Header的Encoding即可正確顯示。
但IE因預設使用不支援中文的編碼,因此有中文檔名需求只能強制指定為唯一支援的big5格式!
但指定為big5格式,則將照成難字依然無法顯示,與Goole不認得big5,所以也會無法正常顯示的問題。
(2010/06/15 測試 Google 瀏覽器 Chrome 也可以正確讀取Big5編碼中文字了!!!)

沒有留言:

張貼留言