UTF-8的CSV文件用Excel打开会出现乱码的解决方案
2012-11-28 14:21
495 查看
为了识别 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
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
相关文章推荐
- java 以utf-8生成csv文件,用excel打开乱码问题解决
- 解决Excel打开UTF-8编码的CSV文件乱码的问题 推荐
- 关于用EXCEL打开".csv"文件中文会出现乱码问题
- 解决PHP生成UTF-8编码的CSV文件用Excel打开乱码的问题
- 解决PHP生成UTF-8编码的CSV文件用Excel打开乱码的问题
- PHP生成UTF-8编码的CSV文件用Excel打开乱码的解决办法
- Excel 2007 打开 UTF-8 编码 CSV 文件的乱码BUG
- 简单有效:解决 Excel 打开 UTF-8 编码 CSV 文件乱码的 BUG
- PHP生成UTF-8编码的CSV文件用Excel打开乱码的解决办法
- JAVA以UTF-8导出CSV文件,用excel打开产生乱码的解决方法
- 解决 Excel 打开 UTF-8 编码 CSV 文件乱码的 BUG
- 如何解决PHP生成UTF-8编码的CSV文件用Excel打开乱码的问题
- utf-8编码的csv文件,用excel打开乱码,解决办法,在输出前加 0xEF,0xBB,0xBF三个char
- PHP生成UTF-8编码的CSV文件用Excel打开乱码的解决办法
- [转]解决 Excel 打开 UTF-8 编码 CSV 文件乱码的 BUG
- 关于CSV文件 Excel打开乱码问题的解决方案
- 解决PHP生成UTF-8编码的CSV文件用Excel打开乱码的问题
- excel打开UTF-8编码的CSV文件,添加BOM头后不再乱码
- [置顶] 解决PHP生成UTF-8编码的CSV文件用Excel打开乱码的问题
- 解决 Excel 打开 UTF-8 编码 CSV 文件乱码的 BUG