求助:Java字符集问题
有如下有关字符集转换的代码段:    
                   byte[]   buf   ={   (byte)0x81,(byte)0x40,(byte)0xb0,(byte)0xa1   }; 
                   //将二进制数据按照GB2312向Unicode编码转换 
                   String   str   =   new   String(buf, "GB2312 "); 
                   for(int   i   =   0;   i    <   str.length()   ;   i++) 
                   { 
                         char   ch   =   str.charAt(i); 
                         //将该字符对应的Unicode编码以十六进制的形式输出 
                         System.out.print(Integer.toHexString((int)ch)); 
                         System.out.print( "-- "); 
                         System.out.println(ch); 
                   }   
 程序的最终输出结果是: 
 fffd--? 
 40--@ 
 554a--啊   
 我的不明白的地方是: 
 四个字节的buf,转换后为什么str的长度会是3,这个过程的转换机制是怎么样的?如何对应起来,最好能够帮忙详细解答一下,谢谢。 
------解决方案--------------------排队听课
------解决方案--------------------0x81转换之后是?,这个占1个字节 
 0x40转换之后是@,同上 
 0xb00xa1转换后是 "啊 ",这个占2个字节   
 事实上,0x81在新的字符集里面没有对应字符,所以是? 
 所以转换后的16进制是fffd,你把0xa1单独转换也会是? 
------解决方案--------------------没搞过````听高人讲解``
------解决方案--------------------同意楼上