csv 用excel默认打开时,中文显示乱码问题/BOM(Bype Order Mark)

从数据库extract data 保存为csv 文本文件,encoding ='UTF8'

 

用excel默认打开时,中文显示乱码。

 

1.选择合适的excel版本,excel 2003中文版(这个没有试过)

2.用editplus,打开,以Unicode 另存为 。 然后用excel 打开,这时,能看到中文,但是都在一个列,可以在使用 data-->text to column 分列。

3.在写csv 的时候,自己写csv 的 'UTF8'格式的开头,这个也没有试过,不过道理上应该可以 :)

4.参考:


http://www.java2000.net/viewthread.jsp?tid=5380
http://www.java2000.net/viewthread.jsp?tid=7378

 

 

======================上面两篇参考文章如下 =================

<!-- /* Font Definitions */ @font-face {font-family:SimSun; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:宋体; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@SimSun"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0in; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:SimSun;} @page Section1 {size:8.5in 11.0in; margin:1.0in 1.25in 1.0in 1.25in; mso-header-margin:.5in; mso-footer-margin:.5in; mso-paper-source:0;} div.Section1 {page:Section1;} -->

utf8文件的标识字符

 

EF BB BF

Unicode签名 BOM(Byte Order Mark)

 

引用: http://blog.csdn.net/thimin/archive/2007/08/03/1724393.aspx

 

近日在调测一个 UTF8编码的中文 Zen Cart网站时遇到一件怪事,网页显示文字正常,用 ie的察看源文件(记事本打开)却发现乱码, firefox没有这个问题。经在网上多方查证和多次测试,解决了这个问题,其实是 UTF-8文件的 Unicode签名 BOM(Byte Order Mark)问题。

 

BOM(Byte Order Mark),是 UTF编码方案里用于标识编码的标准标记,在 UTF-16里本来是 FF FE,变成 UTF-8就成了 EF BB BF。这个标记是可选的,因为 UTF8字节没有顺序,所以它可以被用来检测一个字节流是否是 UTF-8编码的。微软做这种检测,但有些软件不做这种检测,而把它当作正常字符处理。

 

微软在自己的 UTF-8格式的文本文件之前加上了 EF BB BF三个字节 , windows上面的 notepad等程序就是根据这三个字节来确定一个文本文件是 ASCII的还是 UTF-8 , 然而这个只是微软暗自作的标记 , 其它平台上并没有对 UTF-8文本文件做个这样的标记。

 

也就是说一个 UTF-8文件可能有 BOM,也可能没有 BOM,那么怎么区分呢?三种方法。 1,用 UltraEdit-32打开文件,切换到十六进制编辑模式,察看文件头部是否有 EF BB BF 2,用 Dreamweaver打开,察看页面属性,看“包括 Unicode签名 BOM”前面是否有个勾。 3,用 Windows的记事本打开,选择 “另存为”,看文件的默认编码是 UTF-8还是 ANSI,如果是 ANSI则不带 BOM

 

我找到 Zen Cart的模版文件中的 html_header.php,发现文件果然不带 BOM,用 UltraEdit-32另存为的方式加上 BOM后,再上传 html_header.php,一切正常。

 

注意用 Convertz gb2312文件转换成 UTF-8文件时,默认设置是不带 BOM的。不带 BOM可能出现上述乱码问题,但是带 BOM,对于 php include文件要小心,会在 php字节流前面多出 EF BB BF,提前输出到显示器有可能会带来程序错误。一个解决方案是凡是被 include的文件都保存为 ANSI,主文件可以是 UTF-8。要想把一个文件去掉 BOM,使用 UlterEdit打开 , 切换到十六进制编辑模式,把最前面三个字节 (就是那该死的 EF BB BF)替换为 20,保存(注意关闭保存时自动备份的功能),再切换到默认编辑模式,把最前面的三个空格去掉就可以了。

 

另外还学到一些编码的小知识:所谓的 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会使用两个或三个字节。

 

 ----------------------------------------------------------------------------------------------------------------

 

工作需要必须创建 UTF-16格式的文件 .这几天在网络上找 ,似乎没有此类话题 ,无论是国外还是国内 .

代码 :

OutputStreamWriter fos = new OutputStreamWriter(new FileOutputStream(new File("c://2.csv")), "UTF-16");

fos.write("你好 ");

fos.flush();

fos.close();

 

生成文件之后 ,我在 windows平台打开 .使用 editeplus是乱码 .使用记事本打开不乱码 ,保存时察看文件编码确是 unicode big endian. 使用写字板打开时乱码 . 使用 excel打开仍然乱码 .

 

我不过 ,使用下面代码 ,就可以顺利创建 UTF-8的文件 .

OutputStreamWriter fos = new OutputStreamWriter(new FileOutputStream(new File("c://2.csv")), "UTF-8");

fos.write("你好 ");

fos.flush();

fos.close();

 

哪位碰到过这个问题 .帮忙看看

 

 

答:一个简单的问题,楼主怎么弄得这么复杂?楼主的问题是:用 UTF-16格式保存汉字,要求在 WINDOW平台使用:写字板、 EXCEL WORD能正常打开且不乱码(尤其是用 EXCEL能打开,用于导入 .csv文件)。很简单啊,用我的代码,保证你 100%成功。

查看复制到剪切板打印

 

   1. OutputStreamWriter fos = new OutputStreamWriter( 

   2.                 new FileOutputStream(new File("c://2.csv")), "UTF-16LE");  

   3. fos.write(0xFEFF);          

   4. fos.write("你好 ");  

   5. fos.flush();  

   6. fos.close(); 

 

OutputStreamWriter fos = new OutputStreamWriter(

                new FileOutputStream(new File("c://2.csv")), "UTF-16LE");

fos.write(0xFEFF);       

fos.write("你好 ");

fos.flush();

fos.close();

 

A:

提示楼主,写一个编码类型的几个字节到文件里,这样虽然能在 Windows下面的某些程序看到,但你的程序下次处理这个程序时,一定要注意这个问题。

前几个字节是有特殊意义的。

 

下面是部分 BOM的介绍

 

UCS 编码中有一个叫做 "ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是 FEFF。而 FFFE UCS中是不存在的字符,所以不应该出现在实际传输中。 UCS规范建议我们在传输字节流前,先传输字符 "ZERO WIDTH NO-BREAK SPACE"。这样如果接收者收到 FEFF,就表明这个字节流是 Big-Endian的;如果收到 FFFE,就表明这个字节流是 Little- Endian的。因此字符 "ZERO WIDTH NO-BREAK SPACE"又被称作 BOM

UTF-8不需要 BOM来表明字节顺序,但可以用 BOM来表明编码方式。字符 "ZERO WIDTH NO-BREAK SPACE" UTF-8编码是 EF BB BF。所以如果接收者收到以 EF BB BF开头的字节流,就知道这是 UTF-8编码了。

Windows就是使用 BOM来标记文本文件的编码方式的。

 

个人并不建议这样做,因为后患无穷。

 

 

你可能感兴趣的:(windows,Excel,include,csv,Dreamweaver,encoding)