【转】ASP.NET导出CSV文件乱码问题
2013-01-10 14:52
453 查看
原文地址:/article/5579674.html
BOM是UTF编码方案里用于标识编码的标准标记,在UTF-16里是FF FE,UTF-8里是EF BB BF。这个标记是可选的,因为UTF-8没有顺序,所以它可以被用来检测一个字节流是否是UTF-8编码的。微软做这种检测,但有些软件不做这种检测,而把它当做正常字符处理。
微软在自己的UTF-8格式的文本文件之前加上了EF BB BF三个字节, windows上面的notepad等程序就是根据这三个字节来确定一个文本文件是ASCII的还是UTF-8的, 然而这个只是微软暗自作的标记, 其它平台上并没有对UTF-8文本文件做个这样的标记,类Unix系统中就没有使用 BOM,因为它会破坏现有的 ASCII 文件的语法约定。也就是说一个UTF-8文件可能有BOM,也可能没有BOM,那么怎么区分呢?
三种方法:
1、用UltraEdit-32打开文件,切换到十六进制编辑模式,查看文件头部是否有EF BB BF;
2、用Dreamweaver打开,查看页面属性,看“包括Unicode签名BOM”前面是否有个勾;
3、用Windows的记事本打开,选择 “另存为”,看文件的默认编码是UTF-8还是ANSI,如果是ANSI则不带BOM。
所谓的unicode保存的文件实际上是utf-16,只不过恰好跟unicode的码相同而已,但在概念上unicode与 utf是两回事,unicode是内存编码表示方案,而utf是如何保存和传输unicode的方案。utf-16还分高位在前 (LE)和高位在后(BE)两种。官方的utf编码还有utf-32,也分LE和BE。非unicode官方的utf编码还有utf-7,主要用于邮件传输。utf-8的单字节部分是和iso-8859-1兼容的,这主要是为了解决一些旧的系统和库函数不能正确处理utf-16的问题,而且对英语字符来说,也节省保存的文件空间(以非英语字符浪费空间为代价)。在iso-8859-1的时候,utf8和iso-8859-1都是用一个字节表示的,当表示其它字符的时候,utf-8会使用两个或三个字节。
导出代码:
BOM是UTF编码方案里用于标识编码的标准标记,在UTF-16里是FF FE,UTF-8里是EF BB BF。这个标记是可选的,因为UTF-8没有顺序,所以它可以被用来检测一个字节流是否是UTF-8编码的。微软做这种检测,但有些软件不做这种检测,而把它当做正常字符处理。
微软在自己的UTF-8格式的文本文件之前加上了EF BB BF三个字节, windows上面的notepad等程序就是根据这三个字节来确定一个文本文件是ASCII的还是UTF-8的, 然而这个只是微软暗自作的标记, 其它平台上并没有对UTF-8文本文件做个这样的标记,类Unix系统中就没有使用 BOM,因为它会破坏现有的 ASCII 文件的语法约定。也就是说一个UTF-8文件可能有BOM,也可能没有BOM,那么怎么区分呢?
三种方法:
1、用UltraEdit-32打开文件,切换到十六进制编辑模式,查看文件头部是否有EF BB BF;
2、用Dreamweaver打开,查看页面属性,看“包括Unicode签名BOM”前面是否有个勾;
3、用Windows的记事本打开,选择 “另存为”,看文件的默认编码是UTF-8还是ANSI,如果是ANSI则不带BOM。
所谓的unicode保存的文件实际上是utf-16,只不过恰好跟unicode的码相同而已,但在概念上unicode与 utf是两回事,unicode是内存编码表示方案,而utf是如何保存和传输unicode的方案。utf-16还分高位在前 (LE)和高位在后(BE)两种。官方的utf编码还有utf-32,也分LE和BE。非unicode官方的utf编码还有utf-7,主要用于邮件传输。utf-8的单字节部分是和iso-8859-1兼容的,这主要是为了解决一些旧的系统和库函数不能正确处理utf-16的问题,而且对英语字符来说,也节省保存的文件空间(以非英语字符浪费空间为代价)。在iso-8859-1的时候,utf8和iso-8859-1都是用一个字节表示的,当表示其它字符的时候,utf-8会使用两个或三个字节。
导出代码:
public static void ExportToCSV(DataTable dt, string fileName) { StringBuilder sb = new StringBuilder(); int i = 0; for (i = 0; i <= dt.Columns.Count - 1; i++) { if (i > 0) { sb.Append(","); } sb.Append(dt.Columns[i].ColumnName); } sb.Append("\n"); foreach (DataRow dr in dt.Rows) { for (i = 0; i <= dt.Columns.Count - 1; i++) { if (i > 0) { sb.Append(","); } sb.Append(dr[i].ToString()); } sb.Append("\n"); } byte[] buffer = System.Text.Encoding.UTF8.GetBytes(sb.ToString()); byte[] outBuffer = new byte[buffer.Length + 3]; outBuffer[0] = (byte)0xEF; outBuffer[1] = (byte)0xBB; outBuffer[2] = (byte)0xBF; Array.Copy(buffer, 0, outBuffer, 3, buffer.Length); HttpResponse rs = System.Web.HttpContext.Current.Response; rs.ContentEncoding = System.Text.Encoding.UTF8; rs.AppendHeader("Content-Disposition", "attachment;filename=" + fileName); rs.ContentType = "application/ms-excel"; rs.Write(Encoding.UTF8.GetString(outBuffer)); rs.Flush(); rs.End(); }
相关文章推荐
- Asp.net 解决导出CSV文件乱码的问题
- asp.net 导出到CSV文件乱码的问题
- asp.net 导出到CSV文件乱码的问题
- asp.net导出CSV逗号分隔值文件数字自动识别问题
- asp.net 导出excel 中的乱码问题及 到处内容丢失开头的0 的解决方法
- asp.net导出excel乱码问题
- Asp.net Gridview 导出到Excel【解决编码乱码问题】
- 解决用ASP.NET下载文件时,文件名为乱码的问题
- 解决unix(ubuntu)平台下,导出csv文件的乱码问题
- 【原】asp.net导出word,结果导出aspx页面文件的问题
- 导出到CSV文件乱码的问题
- Excel打开从PL/SQL Deleveloper导出的csv文件乱码问题
- Asp.net 下载文件乱码问题一个可能原因--文件名加后缀名
- java utf8字符 导出csv 文件的乱码问题。
- [asp.net]解决下载文件--中文名乱码问题
- asp.net 导出excel文件名称乱码
- asp.net 解决下载文件–中文名乱码问题
- laravel 导出csv文件 用excel打开中文乱码问题之BOM
- asp.net导出excel-一行代码实现excel、xml、pdf、word、html、csv等7种格式文件导出功能而且美观-SNF快速开发平台
- 解决用ASP.NET下载文件时,文件名为乱码的问题