輸出檔案的程式Encoding需注意:
- 輸出Encoding設定可分兩部分,Header部份與Content部份。
- 每個部份的Encoding均必須先設定,再寫入資料避免資料沒被設定到。 Ex:須先設定Response.HeaderEncoding,在Response.AddHeader(),否則設定會失效。
- 檔名如需使用中文,因檔名是寫在Header中,因此要設定Header為相對應Encoding。
- 檔案內容部份,則要將對應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編碼中文字了!!!)