从数据库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
======================上面两篇参考文章如下 =================
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来标记文本文件的编码方式的。
个人并不建议这样做,因为后患无穷。