现在的位置: 首页 > 综合 > 正文

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

2013年09月12日 ⁄ 综合 ⁄ 共 4221字 ⁄ 字号 评论关闭

从数据库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来标记文本文件的编码方式的。

 

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

 

 

抱歉!评论已关闭.