博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UTF-8的CSV文件用Excel打开会出现乱码的解决方案
阅读量:6263 次
发布时间:2019-06-22

本文共 2357 字,大约阅读时间需要 7 分钟。

为了识别 Unicode 文件,Microsoft 建议所有的 Unicode 文件应该以 ZERO WIDTH NOBREAK SPACE字符开头。这作为一个”特征符”或”字节顺序标记(byte-order mark,BOM)”来识别文件中使用的编码和字节顺序(big-endian或little-endian),具体的对应关系见下表。

Bytes           Encoding Form

00 00 FE FF UTF-32, big-endian
FF FE 00 00 UTF-32, little-endian
FE FF           UTF-16, big-endian
FF FE           UTF-16, little-endian
EF BB BF    UTF-8

以UTF-8无BOM格式编码,因此要想导出Microsoft Excel可以正常显示的UTF-8的CSV文件,需要显式的输出BOM(EF BB BF,上表的最后一种类型),然后再输出有效数据。

 

 
"Excel只接受ANSI/BIG5编码的CSV,若存成Unicode,Excel就无法正确显示"。????

恰巧最近在河道上也看到有人在讨论汇出Excel档时的中文编码问题,就决定把我后来研究的心得再整理一下。

经验里要透过ASPX转出非BIG5的CSV的确会有问题,如以下的程式:
排版显示纯文字
<%@ Page Language= "C#" %>
<script runat= "server" >
    protected  void Page_Load( object sender, EventArgs e)
    {
        Response.AddHeader( "content-disposition" ,
            "attachment;filename=UnicodeChar.csv" );
        Response.ContentType = "application/octet-stream" ;
        Response.ContentEncoding = Encoding.UTF8;
        Response.Write( "奔,很多牛" );
        Response.End();
 
    }
</script>
在上例中,Encoding设为UTF8或Unicode都会得到乱码,设成BIG5却又无法显示"奔"字! 难道本题无解? Excel注定不能开启Unicode Encoding的CSV?
"身经百战的Excel无法开启Unicode CSV?" 直觉上是个不合逻辑的推论。于是我做了一个有趣的实验:
排版显示纯文字
 
namespace Lab
{
    class ExcelEncTest
    {
        public  static  void Test()
        {
            writeCSV( "Unicode.CSV" ,
                Encoding.Unicode);
            writeCSV( "UTF8.CSV" ,
                Encoding.UTF8);
            writeCSV( "UTF8woBOM.CSV" ,
                new UTF8Encoding( false ));
        }
 
        static  void writeCSV( string file, Encoding enc)
        {
            string s = "奔,很多牛" ;
            using (StreamWriter sw =
                new StreamWriter(Path.Combine( "C:\\TEMP" , file),
                    false , enc))
            {
                sw.WriteLine(s);
                sw.Close();
            }
        }
    }
}
三个档案中,Unicode.csv能正确显示中文,却没有分成两个栏位。UTF8.csv则中文显示正常,也明确分成两栏,看来就是我们期望的结果。至于UTF8woBOM.csv,我用了点技巧,故意不写入BOM符号,用Excel开启UTF8woBOM.csv的话有点意思...
有没有很眼熟? 不就跟我们在第一张图看到UTF8版的乱码相同? 换句话说,ASPX传回UTF8编码CSV之所以变乱码是因为少了BOM?
知道了问题所在,要解决就不过是蛋糕一块! 改用SteamWriter,输出带有BOM​​的CSV内容,Excel就可以正确地显示万奔奔腾的CSV啰!
排版显示纯文字
<%@ Page Language= "C#" %>
<script runat= "server" >
    protected  void Page_Load( object sender, EventArgs e)
    {
        Response.AddHeader( "content-disposition" ,
            "attachment;filename=UnicodeChar.csv" );
        Response.ContentType = "application/octet-stream" ;
        Response.ContentEncoding = Encoding.UTF8;
        System.IO.StreamWriter sw =
            new System.IO.StreamWriter(
            Response.OutputStream,
            Encoding.UTF8);
        sw.Write( "奔,很多牛" );
        sw.Close();
        Response.End();
 
    }

</script> 

 

参考: 

http://hi.baidu.com/hlhwpz/item/a702c200ad4e9372bfe97edb 

http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/09/06/csv-encoding-again.aspx

转载地址:http://mwzpa.baihongyu.com/

你可能感兴趣的文章
matlab练习程序(差异演化DE)
查看>>
这就是搜索引擎:核心技术详解
查看>>
加解密技术处理时间对比
查看>>
g++命令行详解 (转)
查看>>
Ubuntu菜鸟入门(九)—— 支付宝支付控件安装
查看>>
什么是 SRS 呢?在我们大部分的音频播放器里都内欠有这种音效。
查看>>
对/etc/rc.d/init.d目录的一点理解(转)
查看>>
c#使用params重载方法
查看>>
浅析C# 中object sender与EventArgs e
查看>>
遇到Audio/Speech相关问题,如何抓取log
查看>>
数学之路(3)-机器学习(4)-专家系统(1)
查看>>
Android中常用单位dp,px,sp之间的相互转换
查看>>
C++线性方程求解
查看>>
nginx负载均衡的实现
查看>>
Oracle PL/SQL之LOOP循环控制语句
查看>>
Webkit内核的浏览器中用CSS3+jQuery实现iphone滑动解锁效果(译)
查看>>
Can't create handler inside thread that has not called Looper.prepare()
查看>>
MDaemon运行六年方法
查看>>
SQL SERVER 存储过程应用
查看>>
Locale ID (LCID) Chart 区域设置ID
查看>>