我那天瞎玩,发现个这事: byte[] bytes={1,2,3};
String s=new String(bytes);
System.out.println(s);打出来的是:
三个方框(我粘过来发现是,很神奇)为什么捏?三克油。O(∩_∩)O~

解决方案 »

  1.   

    那是控制字符,是不可显示的。1 是 SOH, start of heading
    2 是 STX, start of text
    3 是 ETX, end of text20H 以下的字符都是不可显的控制字符。
      

  2.   

    String(byte[] bytes) 
              通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
      

  3.   

    这个你看API就知道了
    String(byte[] bytes) 构造一个新的 String,方法是使用平台的默认字符集解码字节的指定数组,该方法无法将字节正确转换为字符。
    你在String这个构造函数中传进来的参数是个byte[]的引用,然后String s=new String(bytes); 
    即调用上面这个构造函数
    所以打印结果是个不可预知的字符,你再次执行可能就是另外的字符,一样不可预知
    不知楼主明白了没有,没事多看看API,JAVA的好处就是把一些方法内部的信息都封装好了,你会查会用就OK了,so easy
      

  4.   

    String(byte[] bytes) 
              Constructs a new String by decoding the specified array of bytes using the platform's default charset.
      

  5.   

    String(byte[] bytes) 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
    1,2,3经过解码,都是不可显的控制字符。就像用简体系统玩繁体游戏,出乱码差不多。
      

  6.   

    String(byte[] bytes) 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String
      

  7.   

    String(byte[] bytes) 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String
      

  8.   

    对啊 大部分系统默认编码无外乎gb系列 iso-8859-1 utf-8等 对于单字节都是按ascii规则映射
    如果其它一些就不一样了
      

  9.   

    编码问题吧
    CSDN--->哥们,请不要恶意灌水
    ME---->无语
      

  10.   

    1,2,3和'1','2','3'应该不一样吧,1,2,3是指的ascii码吧
      

  11.   

    byte[] bytes={1,2,3}; 
    String s=new String(bytes); 
    System.out.println(""+(char)1+(char)2+(char)3); 跟这段程序一样,你对照一下就知道其中的原因了,
      

  12.   

    看看API中有关String()构造函数可能会有帮助。
      

  13.   

    字符编码为题呗。
    数字的字符编码,一般不会编成对应的值。
    数字、字节和字符这三个数据类型是要区分开来滴。
    String的构造器,楼主可以观察一下它的源码,这种调用,实际上是按照系统默认编码进行转换的。
    也就是说,如果你的系统默认是GBK编码,那么,它会将这三个字节,按GBK编码来转换成字符串。
    楼主可以查一下字符编码对照表,就可以了。
    当然,我们知道GBK编码,当当前字节,其对应的数值小于128时,是与ACSII编码相同的。
    由于LZ举得例子都满足上述条件,所以,只要查询ACSII字符编码对照表即可了。
    因为,对应的不是我们经常看到的字符,所以显示出来比较怪异。
      

  14.   

    筒子们,我明白了,经过大家启示:
    那个貌似很吓人的回答是对的,呵呵。
    就是当:
    byte[] bytes={xx}
    就是这个xx,当咱写{1,2,3}时,被认为是Ascii2码1,2,3,就是
    Bin Dec Hex 缩写/字符 解释 
    00000000 0 00  NUL(null) 空字符  
    00000001 1 01 SOH(start of handling) 标题开始 
    00000010 2 02 STX (start of text) 正文开始 
    00000011 3 03 ETX (end of text) 正文结束 参看:http://baike.baidu.com/view/15482.htm当咱写{'1','2','3'}时,它认为是字符,还是按照Ascii2码存储,就是
    Bin Dec Hex 缩写/字符 解释
    00110001 49  31 1    
    00110010 50  32  2   
    00110011 51  33 3    我try了一下:
    byte[] bytes={49,50,51};
    String s=new String(bytes); 
    System.out.println(s);
    输出是:
    123还有位高人说:
    System.out.println(""+(char)1+(char)2+(char)3)
    结果也是三个框,我试了,是这样的。
    就是在Java中char是按照Ascii编码的,所以强制转换后就变成了Ascii码的十进制表示方式:1,2,3。
    所以
    System.out.println(""+(char)0x01+(char)0x02+(char)0x03); 
    System.out.println(""+0x01+0x02+0x03); 
    输出是:
    三个框
    123
    呵呵,归根结底是当我们给byte数组赋值时,它以Ascii编码成二进制存在内存中。
    比如:
    {49,50,51}//十进制
    {'1','2','3'}//字符
    {0x31,0x32,0x33}//十六进制
    (二进制没试出来,(⊙o⊙)…)
    但是我估计它们都被Ascii2编码成二进制:00110001 ,  00110010 ,00110011  存入内存中,
    然后就是取出来解码,这就涉及到解码,
    数据->某种编码方式->二进制机器码->某种解码方式->数据
    要是编码方式和解码方式不对照,就会出现传说中的乱码咯。
    (感觉这东西应该是灰常基础滴,唉,伤感ing)应该注意的是通常给byte单独赋值时:
    byte b=1;
    System.out.println(b);
    输出是:
    1还有一个很有趣的现象:
    当我从Eclipse的控制台上将三个框赋值,粘贴到这里,变成了
    ,有没有高人给个解释?最后谢谢大家,祝大家新年快乐,\(^o^)/~
      

  15.   


    byte[] bytes = { 1, 2, 3 ,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21};
    String s = new String(bytes);
    System.out.println(s);
    我又用这个试了下,发现打印出来的是:
    

    貌似和您说的不一样呀!
      

  16.   

    哎,为啥不一样?这些都是控制字符,根本不可能显示的!像“10”是个“换行符”,只能显示成一个换行,不可能显示成一个字符的吧?“9”是个“TAB”,显示出来就是一个跳格符