public class Example8_7
{
  public static void main(String args[])
  {
   byte d[]="Java天下好".getBytes();
   String s=new String(d,4,1);
   System.out.println(s);
   s=new String(d,0,6);
   System.out.println(s);
  }
}这是我刚刚改编的程序,本来String s=new String(d,4,1);
这句是String s=new String(d,4,2);
的,这样的话第一个输出应该是“天”,然后我就是有点脑子发热,想看一下String s=new String(d,4,1);
会输出什么?但是发现输出的是‘?’号,然后我把"Java天下好"换成"Java你下好".
但是发现输出的还是‘?’号,我个人本来是想验证一下我下面的这个想法的:
首先,一个字符占两个字节,然后getBytes()则将小于255以下的两字节的char转化成一字节存放进byte中,将占两字节的超过255的字符(比如汉字字符)用两个byte存储,那么我现在输出
String s=new String(d,4,1);
中的s应该是”天“这个字二进制表示的前8位的那字呀,为什么不对呢????
我哪里被弄混乱了。。求大神啊

解决方案 »

  1.   

    一个字母占一个byte
    一个汉字点两个byte这里的问号是乱码的意思吧,不是标准的问号字符
      

  2.   

    看我刚刚写的博客:http://blog.csdn.net/logicteamleader/article/details/8250097
      

  3.   

    接分
    你的编码默认的是GBK,英文字符占一个字节,中文占两个字节,你new String(d,4,1),表示从第四个字节开始,取一个字节出来,这一个字节通过GBK转成字符串,当然就会乱码,乱码就会显示成问号。除非你取出的这个字节的值刚好有一个英文字符在GBK里面有对应的编码。