import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;public class test{
public static void writeLog(String fileName, String content) {
 try {
  RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
  raf.seek(raf.length());
  raf.write(content.getBytes("UTF-8"));
  raf.close();
 } catch (FileNotFoundException e) {
  e.printStackTrace();
 } catch (IOException e) {
  e.printStackTrace();
 }
}public static void main(String[] args) {
test tt = new test();
tt.writeLog("D:/worksoft/Java/jdk1.5.0_18/bin/www.xml","我wo");
我的程序如上。
按理说出来的文档中,“我”占2个字节,“wo”各占一个字节,可是字母却占4个字节。
这是为何?
我的jdk版本是jdk1.5.0_18。
各位大侠帮忙吧。

解决方案 »

  1.   

    这种情况更像是unicode的模式。愁人啊!~~~~~~~~~~~~~~~
      

  2.   

    嗯 你在项目的属性下看看是不是utf-8编码的
      

  3.   

    getBytes不是表示他们占用内存的大小,而是他们自身的大小
    java里面是unicode,所以都是2个字节
      

  4.   


    楼主理解错误
    在UTF-8中,“我”占3个字节,就是:e6 88 91
    “wo”各占一个字节,分别是:77  6f  [也就是ASCII码值]
      

  5.   

    你好,你说的对。
    可是字母占2个字节是正常的了?为什么同样的77 6f ,UTF-8中占2个字节,ANSI中占1个字节?
      

  6.   


    大侠,
    那如何修改成utf-8呢?
      

  7.   

    还有个问题,就是字母在UTF-8格式里。是不是就占2个字节呢?
    我用UltraEdit 15 版本,生成了一个无BOM头的UTF-8的文件。一检查发现就是占用2个字节的。请高人确定!~
      

  8.   

    不太明白楼主因为什么东西而迷惑,似乎4楼已经把明天说的很清楚了。"我wo" = '我'+'w'+'o'
    '我': 三字节
    'w': 一字节
    'o': 一字节一起五个字节PS:
    UTF-8中,字母是一个字节,符号拉丁字母二个字节,汉字还有其他的日语韩语之类的三个字节。
      

  9.   


    楼主误解了:标准ASCII字符(0-127)如:'w','o'无论在UTF-8中,还是ASCII中,都是一个字节。
      

  10.   

    UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。UTF-8的编码规则很简单,只有二条:
    1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
    2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
    下表总结了编码规则,字母x表示可用编码的位。
    Unicode符号范围 | UTF-8编码方式
    UTF字节数                  (十六进制) | (二进制)
    --------------------+---------------------------------------------
    一个字节 0000 0000-0000 007F | 0xxxxxxx
    两个字节 0000 0080-0000 07FF | 110xxxxx 10xxxxxx
    三个字节 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
    四个字节 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    下面, 还是以汉字“严”为例,演示如何实现UTF-8编码
    已知“严”的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此“严”的UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,“严”的UTF-8编码是“11100100 10111000 10100101”,转换成十六进制就是E4B8A5。
      

  11.   

    字符的UTF-8编码与Unicode编码之间的转换关系对应下列规则:
          \u0001和\u007f之间的字符,UTF-8编码为:(byte)c.
          \u0000或其在范围\u0080和\u07ff,UTF-8编码为:
             (byte)(0xc0|(0x1f&(c>>6))),(byte)(0x80|(0x3f&c))
          \u0800和\uffff之间的字符,UTF-8编码为:(byte)(0xe0|(0x0f&(c>>12))),byte)(0x80|(0x3f&(c>>6))),byte)(0x80|(0x3f&c))
      

  12.   

    嗨~各位,是我没说明白。
    那就“wo”来说,
    在ANSI格式下,用UltraEdit打开,选中一个字母(也就是使一个字母高亮),UE工具的右下角会显示占用字节数,上面显示的是1.
    而在UTF-8下,同样的工具打开,选中一个字母,UE则会显示占用2个字节。
    我只是不懂这是啥意思了。而且,这种格式似乎导致了IBM一个中间件处理上出现问题。嗨~郁闷呀。
      

  13.   

    我估计是你的UltraEdit打开文件选择的模式有问题,转换一下看看。wo在utf8下应该一共是2个字节