工作需要必须创建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%成功。
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来标记文本文件的编码方式的。
个人并不建议这样做,因为后患无穷。