web汇出的EXCEL乱码
问题描述
汇出的EXCEL档案,如果很多笔,OK.
但若汇出的资料只有一笔,就会有中文乱码的情况
而EXCEL乱码的档案,如果用记事本打开中文能正常显示.用记事本开,查看它的编码为utf8.
-- | ----
用记事本开| 正常显示
用EXCEL开| 乱码
查看记事本编码| utf-8
原因
因为没有BOM,但为什么一笔没有BOM,多笔就有BOM,不得而知.
解决方法
所以我们就要让它有BOM.
怎么让它有BOM,我们可以用stream,stream指定UTF8的话,就会自动加上BOM了.
ref
https://blog.darkthread.net/blog/csv-encoding-again/
加上stream后的程式码如下(DataGrid)
Response.ClearContent();
Response.Clear();
Response.Buffer=true;
Response.Charset ="UTF-8"; //设定字集
Response.ContentEncoding = System.Text.Encoding.UTF8;//表格内容新增编码格式string sFilename = HttpUtility.UrlEncode("中文", System.Text.Encoding.UTF8);//处理中文档名乱码 Response.AppendHeader("Content-Disposition","attachment;filename="+sFilename+".xls"); Response.ContentType = "application/ms-excel "; //内容型态设为Excel this.EnableViewState = false; //把ViewState给关了 System.IO.StringWriter objStringWriter = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter objHtmlTextWriter = new System.Web.UI.HtmlTextWriter(objStringWriter); this.DataGrid1.RenderControl(objHtmlTextWriter); //get画面上的资料 System.IO.StreamWriter sw =new System.IO.StreamWriter(Response.OutputStream,System.Text.Encoding.UTF8);//这样一笔的时侯,就不会乱码了 sw.Write(objStringWriter.ToString()); sw.Close(); Response.End();
目前已知2种function可以加上BOM,File.WriteAllText 和 StreamWriter.
使用方式大概有2种,一种指定字码,一种不指定.
指定字码,也可设定不产生BOM.
*StreamReader 预设会先自动判断档案编码,无法确认才会使用设定的编码。
所以如果不需要BOM的话,不指定也没关係.
ref
https://blog.darkthread.net/blog/write-utf8-file-with-bom/
而Stream加上BOM,writer和reader之间,是怎么运行的呢?
----以下是坑.读者请自行略过