首先String以byte数组中的byte值为基础,用系统默认的格式进行编码生成一个字符串,如果你的系统的默认编码不支持中文的话,当然就不能输出回字,如果你的系统编码格式不支持中文,既可以在String中加第二个参数作为编码格式像gb2312,GBK等等.
你可以通过System.getProperty("file.encoding");取出你系统的默认编码格式.
也可以通过System.serProperty("file.encoding",charsetname);来设置编码格式.
你不要通过取得它的编码就认为它是补码表示的所以就将它转化为原码来表示,如果系统用补码你也就用补码,何必将它转化为原码呢?这是针对你上个问题所说的.

解决方案 »

  1.   

    我就是想知道new String(byte[])里有哪些代码。
    是怎么从{-69,-40}算出“回”字的
      

  2.   

    内部实现GB2312->Unicode的转换
    可以参考string.java等源码
      

  3.   

    public String(byte[] b){
        ......
    }
    里究竟有哪些代码?
      

  4.   

    public String(byte[] b){
        ......
    }
    里究竟有哪些代码?
    public String(byte[] b){
        ......
    }
    里究竟有哪些代码?
    public String(byte[] b){
        ......
    }
    里究竟有哪些代码?
    public String(byte[] b){
        ......
    }
    里究竟有哪些代码?
    public String(byte[] b){
        ......
    }
    里究竟有哪些代码?
    public String(byte[] b){
        ......
    }
    里究竟有哪些代码?
      

  5.   

    大致这样:
       
        byte b[] = {-69, -40};
        ByteToCharConverter converter = ByteToCharConverter.getConverter("gb2312");
        char[] c = converter.convertAll(b);
        String s = new String(c);
        
        System.out.println(Integer.toHexString(c[0]));
        System.out.println(Integer.toHexString('回'));
      

  6.   

    因为一个汉字是由2个字节组成,而且每个代表字节的数都是负的,所以byte[] b={-69,-40};
    然后String s = new String(b);这一句的作用就是将字符行的b转换成字符串类型,结果就返回了一个汉字!
    其实你可以把69和40换成别的数,结果也会输出汉字的!不过不能把负号丢了!
    要是丢了就不是汉字了!
      

  7.   

    String(byte[] b)是String的一个构造函数,你要问里面有哪些代码的话,你去问问sun公司是怎样实现这个构造函数的,看jdk的源代码.不过现在jdk是不开源的.
    我想搂住一定是从c++转过来的高人,为什么问这样的问题.
      

  8.   

    //里究竟有哪些代码?你可以仔细去看看string.java    public String(byte bytes[], int offset, int length, String charsetName)
    throws UnsupportedEncodingException
        {
    if (charsetName == null)
        throw new NullPointerException("charsetName");
    checkBounds(bytes, offset, length);
    value = StringCoding.decode(charsetName, bytes, offset, length); //in stringcoding.java
    count = value.length;
        }
      

  9.   

    英文字符一般是以一个字节来表示的,最常用的编码方法是 ASCII 。但一个字节最多只能区分256个字符,而汉字成千上万,所以现在都以双字节来表示汉字,为了能够与英文字符分开,每个字节的最高位一定为1,这样双字节最多可以表示64K格字符。
    字符第一位为1,意味着这个字符是一个负值。
    这样楼主该明白了吧。
      

  10.   

    任何语言的最基本的存储都是“0”“1”串嘛,在生成String的时候,首先将你输入的-69,-40转换成“0”“1”串,然后按照系统的编码规则将这个串转化成一个String Object,在使用System.out.println将这个String Object打印出来了。
    如果系统的编码规则变化了,那么相同的“0”“1”串,打印出来的结果也不一样拉。
      

  11.   

    中文以2个字节表示,每个字节开头是1表示它不是普通的ascii码,所以你用两个负数自然变成了中文。
    至于你想知道到底是怎样实现的,安装JDK时选择安装源代码包,自己看看java.lang.String的源码
      

  12.   

    看来主要还是ascii码惹的出来的。
    UP一下
      

  13.   

    这个是因为你当前的编码方式是 gb2312,如果改为其他,就打不出 "回"字了.
    byte流转化为char流的原因这相当于ByteBuffer bytebuffer里的内容为{-69,-40}char ch= Charset.forName( "gb2312" ).decode(bytebuffer);
    那么ch 即为 "回"字可以看一下 nio里面的说明.
      

  14.   

    请问new String(byte[])是怎样算出“回”字的,也就是new String(byte[])里应该是怎样实现的?两个字符组成一个汉字, 要想某个汉字由什么字符组成只有去查书了