• UTF8的CSV文件用Excel打开会出现乱码的解决方案


    为了识别 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

  • 相关阅读:
    Tomcat + Mysql高并发配置优化
    Qt Widget 利用 Qt4.5 实现酷炫透明窗体
    使用VC2005编译真正的静态Qt4.4.3程序 good
    详解 Qt 线程间共享数据(使用signal/slot传递数据,线程间传递信号会立刻返回,但也可通过connect改变)
    浅析在QtWidget中自定义Model(beginInsertRows()和endInsertRows()是空架子,类似于一种信号,用来通知底层)
    英国著名芯片厂商与苹果谈崩 中资收购机会来了!
    跨站脚本攻击(XSS)
    Kafka 协议实现中的内存优化
    读取配置信息
    英语面试准备
  • 原文地址:https://www.cnblogs.com/itelite/p/2792545.html
Copyright © 2020-2023  润新知