我现在想新建一个文件,然后用UTF-16写内容进去,写完之后发现文本格式是UTF-16BE了。
怎样写完之后还是UTF-16?
public static void writeToFile(List<String> lines, File f)
throws IOException {
System.out.println("writeToFile function started.");
String encoding = "UTF-16";
FileOutputStream fos = new FileOutputStream(f);
OutputStreamWriter writer = new OutputStreamWriter(fos, encoding);
BufferedWriter bw = new BufferedWriter(writer);
for (String s : lines) {
bw.write(s);
bw.newLine();
}
bw.flush();
writer.flush();
fos.flush();
bw.close();
writer.close();
fos.close();
System.out.println("writeToFile function finished.");
}

解决方案 »

  1.   

    图片上传插件太烂了,传10分钟都不行.图片看这里吧:http://img.my.csdn.net/uploads/201309/23/1379929779_1596.jpg
      

  2.   


    不是啊,我不要UTF-16BE 也不要UTF-16LE的,只想要UTF-16格式就行了。
      

  3.   

    标准 charsetJava 平台的每一种实现都需要支持以下标准 charset。请参考该实现的版本文档,查看是否支持其他 charset。这些可选 charset 的行为在不同的实现之间可能有所不同。Charset描述US-ASCII 7 位 ASCII 字符,也叫作 ISO646-US、Unicode 字符集的基本拉丁块
    ISO-8859-1   ISO 拉丁字母表 No.1,也叫作 ISO-LATIN-1
    UTF-8 8 位 UCS 转换格式
    UTF-16BE 16 位 UCS 转换格式,Big Endian(最低地址存放高位字节)字节顺序
    UTF-16LE 16 位 UCS 转换格式,Little-endian(最高地址存放低位字节)字节顺序
    UTF-16 16 位 UCS 转换格式,字节顺序由可选的字节顺序标记来标识http://download.oracle.com/technetwork/java/javase/6/docs/zh/api/java/nio/charset/Charset.html
    这意思我写文件不管怎样都不能使UTF-16格式的了??我的意思就是用ultraedit看的时候不可能是UTF-16了??
      

  4.   


    问你一句,这里红色这句,你确实理解了吗? 确实理解了的话,应该你就不会有你最初的问题。麻烦解释下,我真不懂字节顺序标记byte-order ,BOM,简单来说,就是文件头两字节,用来标记接下来的文件内容是UTF-16BE还是UTF-16LE。即高位在前还是低位在前。UTF-16,在存储的时候必然是BE或LE中的一种。UTF-16,可以认为是1到2个word组成,1 word =2 byte,
    往文件里写的时候,BE就是先存word高位byte,后存低位的byte,LE反之。你在读取文件的时候要么事先知道文件是BE的还是LE的,然后按正确方式去读一个一个byte。
    要么从BOM得知接下来的字节流是BE还是LE,然后去读一个一个byte,当然前提是文件创建者把BOM写入文件了。http://zh.wikipedia.org/wiki/%E4%BD%8D%E5%85%83%E7%B5%84%E9%A0%86%E5%BA%8F%E8%A8%98%E8%99%9F
      

  5.   

    UTF-16编码,是一个字符映射成两个字节,也就是说,两个字节为一组,表示一个字符。
    编码只是映射规则,但是,映射之后,由于这个编码是定长编码,也就是说字符编码后的数据是固定长度的(2个字节),那么,就会存在字节序的问题。
    字节序应该懂吧? 就是说,两个字节表示一个字符,那么,这两个字节在存储的时候,是高位字节在前,还是低位字节在前啊。
    基于字节序的问题,存储方案就有了如下的三种方式:
    一、 UTF-16BE 高位字节在前。就是说双方约定整个字符串对应数据区域都用这种方式存储数据。
    二、 UTF-16LE 低位字节在前。也是一种约定,如果不按这个约定来存取,解码会出现乱码。
    三、 保存数据的时候,先保存一个BOM(两个字节的字节序标识符),在保存字符数据,
         读取的时候也先读取BOM,根据对应的字节序来解码后面的字符数据。总之,这三种方案,只是编码后的数据的存储方案,并非编码规则。
    UTF-16是一种编码规则,这三种方案,采用的是同一个编码规则(UTF-16),只是存储(传输)的方式不同而已。
      

  6.   

    字节序问题,在计算机通讯当中,属于基础概念。举个简单的例子:
    整型数据(int)是4个字节的数据,这个也可以看出是一个定长编码(如果有一个整型数组的话,会更明显一些)。
    那么,这个整数,在存储的时候,也会存在,高位字节在前,还是低位字节在前(或者高位bit在前还是低位bit在前)的问题。
    当然,我们现在的大部分操作系统和应用程序,都采用的高位在前的处理方式,因为这样便于理解。
    但是,也有极少一部分的操作系统和应用程序,采用低位在前的处理方式。
    这只局限于整型数据。图片数据的存储,有的图片文件(格式)中,也会保存一个字节序标识符,用于兼容不同操作系统、应用程序和传输协议。
      

  7.   


    红字部分不太对。
    UTF-16 和 UTF-8 一样,是变长码。UTF-8 字符1-4字节都可能。
    UTF-16字符则是2字节或4字节,不一定是2字节。
      

  8.   


    红字部分不太对。
    UTF-16 和 UTF-8 一样,是变长码。UTF-8 字符1-4字节都可能。
    UTF-16字符则是2字节或4字节,不一定是2字节。
    “csdn 论坛无法正确解析位于Supplementary Planes的字符,刚才打了一大段都没了。
    简单说下,UTF-16 表示位于Supplementary Planes的字符,需要使用surrogate pair,
    即2个2字节,共4字节。
      

  9.   

    LZ 只要清楚 UTF-16 有两种:UTF-16BE 和 UTF-16LE,只能用这两种的其中一个,只写 UTF-16 的话,程序会在两种中默认选一个。
      

  10.   

    对,UTF-16是变长的,只有两种长度,双字节和四字节,这是编码规则规定的。
    前面我说的那个是UTF-16的一个子集(UCS-2编码),长时间不用,给弄混了。
    但是,编码规则,和存储顺序,应该分开考虑。
    高位优先还是低位优先,要读写双方共同遵守、一致才行。
    所以,出现了BE和LE的情况。那种不带BE和LE的情况,是没有指明存储格式,用到的时候,从两种里面选一种就好了(当然,选错了就会有乱码)。
    楼主的编辑器软件,指明了文件数据所采用的字节序,只能说,表述问题更精确,不能说它不是UTF-16编码。
    或者,楼主可以直接按楼上(13楼)的那样理解。