我在一本书上说java的字符是unicode码,每个字符占两个字符.不知对不对.又有人说在键盘输入的字符是要经过GBK编码的,把每个英文字母编成一个字节了,我做了个小测试
inputstream中有一个函数是read(),书上说它一次只能读取一个字节的内容。但得的结果:
system.out.println(system.in.read()); 
如果我在键盘上敲击A,会输出65,也就是字母A的asc2表的代号。
如果一个字母是占两个字节的,而read一次只能读一个字节,那末为何在这里read()一次就可以把A全部读入了?难道GBK编码的字符,英文占一个字符,中文占两个字符? 

解决方案 »

  1.   

    中文字符占两个字节。为什么read()读入一个字节就能把A全读入的原因:我们知道ASCII码是八位的,A在ASCII码中有相应的码对应,也就是说A只要八位就能表示了,但是unicode是支持ASCII码的,所以在unicode中表示A的时候是用第八位的ASCII码补上高八位0,read()读入一个字节的时候已经读入了A的ASCII码了,打印的时候会给其高8位补上0的,所以能正常显示A。
      

  2.   

    Java 中的字符本身没有这个概念。但是将字符转换成字节时,组要指定编码。不同的编码会得到不同长度的字节串。
      

  3.   

    你输入一个中文也是出来一个int范围的数字啊,因为read的返回值是int的,只在那个很小的范围,是把2个字节给截断到一个字节了吧
      

  4.   

    System.in.read() 返回的是输入数值的 ASKII 码(一个 int 整数)。
    如果要求输入输出的一致的话:
    通常情况下,你会用readLine( )一行一行地读取输入,因此要把System.in包装成BufferedReader。但在这之前还得先用InputSteamReader把System.in转换成Reader。
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      

  5.   

    在字符输出过程中,有unicode向本地系统字符集转换的过程.
    GBK也是双字节编码的.在JAVA中输入一个chat类型,它是占两字节的.
    inputstream中的函数read(),一次只读取一个字节,但是它还是会变成32位的,只要在它的高位补0,凑成32位就可以了.
      

  6.   

    当然不对一个字符要看什么字符
    一个ascii (0-255)可以用8位二进制表示所以只占一个字节
    超过0-255范围就要用二个字节因为8位二进制不够表示了
      

  7.   

    int c = '王';
    System.out.println(c);
    //打印出来的结果是    29579这个对应的二进制是  111001110001011
    //如果是A的话打印出来的是 65  对应的是  1000001
    //显然Uncode编码不代表每个字都占两个字节。
      

  8.   

    可以这么说,unicode,gbk都是双字节的,用read读它会自动识别,当读入像英文这样的可以用一个字节表示的时候,它会自动在高位补0
      

  9.   

    unicode 就是一个字符占两个字节
    如果是英文字符 高位自动补0的如果能看懂
    windows API MutilByteToWiderChar 就知道了
      

  10.   

    这个和具体你java源文件编码有关。
    比如你java源程序设定的编码是gbk,那么一个汉字字符2个字节,如果是utf-8,则是3个字节
      

  11.   


    public class fd {
    public fd() {
    String string1 = "aaa";
    String string2 = "字字字";
    System.out.println(string1.getBytes().length);
    System.out.println(string2.getBytes().length);
    } public static void main(String[] args) {
    new fd();
    }
    }这个运行后是3 和 9 
    我用的是utf-8编码 你可以自己试试换个编码
      

  12.   

    FYI:
       UTF非固定字节编码,1到3个字节不等
      

  13.   

    2个字节,在各种平台上都一样。这也java跨平台的保证之一
      

  14.   

    这位的意思是不是说字符"A"在数据流中还是占8位字符,这样read()一次就能把这8位全都读出了,但在显示时,会自动给前边再补8位0,以凑成16位,我这样理解对吗?
      

  15.   

    unicode一定是2个字节
    UTF-8是1到3个字节不确定
      

  16.   

    java的字符是unicode编码   unicode英文字符占1个1个字节 汉字占2个字节
      

  17.   

    内部表示是unicode。但是楼主的例子不合适。输入输入的表示是和系统相关的(汇编语言最清晰),最原始的看法一切都是字节流只是你的解释不同则不同了。楼主的例子可以这样来:
            try{
                int i ;
                i = System.in.read();
                char ii;
                ii = (char)i;
                System.out.print(i);
            }catch(Exception e)
            {}在ii处设断点,可以使用调试工具看编为"\u0041".呵呵.多一些思考就好了.事物不是一成不变的,Java中字符编都是转来转去的.可以在google中搜一下.