下面是孙鑫Java Web 开发详解中一段代码:
代码输出是:
fffd--?
40--@
554a--啊
我不明白为什么输出是三行?究竟String str = new String (buf,"GB2312");是怎么转换的?
(至于其中的fffd输出,解释是0x8140从GB2312向Unicode转换,然而由于0x8140不在GB2312编码范围
,没有对应字符,就转换为0xffd.所以输出第一行我理解.)还有第二行,第三行是怎么来的?-------------------------------------------------
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++)
{
    //取出字符串中的每个Unicode编码的字符
    char ch = str.charAt(i);
    //将该字符对应的Unicode编码以十六进制的形式输出
     System.out.print(Integer.toHexString((int))ch));
     System.out.print("--"):  
     System.out.pritln(ch);
}
------------------------------------------------

解决方案 »

  1.   

    {(byte)0X81,(byte)0X40,
    输出第一行和第二行
    ,(byte)0xb0,(byte)0xa1
    输出第三行至于原因肯定是编码的事,具体的查一下gb2312的编码吧
    我手头也没有资料
      

  2.   

    Byte-->Unicode,&#58853;&#58853;如果Byte标识的字符在源代码集不存在,则得到的结果是0xfffd.&#58853;
    如:
    Byte&#58853;ba[>&#58853;=&#58853;{(byte)0x81,(byte)0x40,(byte)0xb0,(byte)0xa1};&#58853;new&#58853;String(ba,"gb2312");&#58853;
    结果是"?啊",&#58853;hex&#58853;值是"\ufffd\u554a".&#58853;0x8140&#58853;是GBK字符,按GB2312转换表没有对应的值,取\ufffd.&#58853;(请注意:在显示该uniCode时,因为没有对应的本地字符,所以也适用上一种情况,显示为一个"?".)实际编程中,JSP/Servlet&#58853;程序得到错误的汉字信息,往往是这两个过程的叠加,有时甚至是两个过程叠加后反复作用的结果.
      

  3.   

    Byte-->Unicode,  如果Byte标识的字符在源代码集不存在,则得到的结果是0xfffd.
    如:
    Byte ba[> = {(byte)0x81,(byte)0x40,(byte)0xb0,(byte)0xa1}; new String(ba,"gb2312");&#58853;
    结果是"?啊", hex 值是"\ufffd\u554a". 0x8140 是GBK字符,按GB2312转换表没有对应的值,取\ufffd. (请注意:在显示该uniCode时,因为没有对应的本地字符,所以也适用上一种情况,显示为一个"?".)实际编程中,JSP/Servlet 程序得到错误的汉字信息,往往是这两个过程的叠加,有时甚至是两个过程叠加后反复作用的结果.从其他地方复制的,有乱码
      

  4.   

    hzoome:
    你说的我理解,我现在不明白为什么输出三行.