java创建UTF-16编码的文件乱码..似乎从来没有人碰到过这个问题.

yuanetking 2008-05-19 05:16:23
工作需要必须创建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();


哪位碰到过这个问题.帮忙看看..
...全文
739 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
molemole333 2010-07-20
  • 打赏
  • 举报
回复
看下内哦那个
yuanetking 2008-05-20
  • 打赏
  • 举报
回复
jiangnaisong
您好,我的问题已经解决了,我还有两个相同的帖子一共200分(不小心发的),你到我那两个相同的帖子上说句话,我好把分给你。
非常感谢。
老紫竹 2008-05-20
  • 打赏
  • 举报
回复
提示楼主,写一个编码类型的几个字节到文件里,这样虽然能在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来标记文本文件的编码方式的。

个人并不建议这样做,因为后患无穷。
云上飞翔 2008-05-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 yuanetking 的帖子:]
工作需要必须创建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. 使用写字板打开时乱码. 使…
[/Quote]
答:一个简单的问题,楼主怎么弄得这么复杂?楼主的问题是:用UTF-16格式保存汉字,要求在WINDOW平台使用:写字板、EXCEL、WORD能正常打开且不乱码(尤其是用EXCEL能打开,用于导入.csv文件)。很简单啊,用我的代码,保证你100%成功

OutputStreamWriter fos = new OutputStreamWriter(
new FileOutputStream(new File("c:\\2.csv")), "UTF-16LE");
fos.write(0xFEFF);
fos.write("你好");
fos.flush();
fos.close();

lblxiaoyu 2008-05-19
  • 打赏
  • 举报
回复
顶 像5楼学习,支持
javagxc 2008-05-19
  • 打赏
  • 举报
回复
楼上说的好,支持你,学习了
大海Online 2008-05-19
  • 打赏
  • 举报
回复
每个文本编辑器打开文件时都有自己的一套编码识别方式.
文件在保存时,没有一个统一的规范来指定一个文本文件具体在文件的哪个位置表示编码格式,所以文本编辑器无法识别一个文件具体是用什么编码方式的,如果文本文件采用了特别的编码文式,文本编辑器打开当然是乱码了.

在中文环境下,默认的编码方式是GBK的,所有每个文本编辑器都可以识别GBK编码的,而UTF-8编码是在字符串的最前面加入了三个字符来标识UTF-8编码的

像GB2312,GB18030,GBK,BIG5,ISO8859-1等各种本地化编码在文本文件中是没有前导符来指示这个文件的编码的,所以文本编辑器是根本无法判断这类文本文件的编码方式.所以用非默认编码或不兼容的编码方式创建的文本,在文本编辑器打开后,都会乱码

windows,linux,aix这些操作系统,每个都支持100多种编码方式,如果用其它编码方式创建的文件,在中文环境(GBK环境)下打开,当然是乱码了

至于UTF-8为什么没有乱码,是因为UTF-8规范中有特别的编码识别方式.并且java也支持.

想想,为什么 DataInputStream, DataOutputStream类中专门有 readUTF, writeUTF, 而没有readGBK,writeGBK,就能理解了
waitgod 2008-05-19
  • 打赏
  • 举报
回复
新鲜~~~~、
关注!!!
psyl 2008-05-19
  • 打赏
  • 举报
回复
发了4遍。。。
yuanetking 2008-05-19
  • 打赏
  • 举报
回复
对了,我再强调一下,我必须使用编程方式.
而且,我已经使用eclipse建立了一个文件,修改成UTF-16,再用windows打开同样存在这样的问题.
老紫竹 2008-05-19
  • 打赏
  • 举报
回复
用 Eclipse 打开啊!

这个可以指定文件自己的编码的!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧