A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 夏儒日 中级黑马   /  2012-7-9 13:03  /  1299 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

以下是毕姥爷关于解码编码的程序,我稍微修改了下,有几个不明白的地方:
1.毕姥爷不是说联通GBK二进制编码形式正好符合UTF-8的编码形式么,既然联通二字的GBK二进制编码形式正好符合UTF-8编码形式,那么UTF-8解码后应该是UTF-8能识别的字符啊?而程序的结果怎么对联通二字进行GBK编码后进行UTF-8解码的字符是"???",这个不理解,求高手指教!!!
2.联通二字的二进制编码依次是11000001   10101010    11001101    10101000,按UTF-8查表规则,这些二进制编码查出来的应该是两个字符,怎么程序打印出来的是三个不识别的字符(即?)?
程序代码如下:
mport java.util.*;
class  EncodeDemo2
{
public static void main(String[] args) throws Exception
{
  String s = "你好";//依次换成哈哈和联通
  System.out.println("需编码的文字s:  "+s);
  byte[] b1 = s.getBytes("GBK");
  int x = 1;
  System.out.println("需编码文字的GBK编码b1:  "+Arrays.toString(b1));
  for (byte b : b1 )
  {
   //输出二进制编码
   System.out.println("第"+x+"个字节的二进制编码:"+Integer.toBinaryString(b&255));
   x++;
  }
  
  String s1 = new String(b1,"UTF-8");
  System.out.println("GBK编码后查表UTF-8的乱码文字s1:  "+s1);
  
  //对s1进行iso8859-1编码
  byte[] b2 = s1.getBytes("utf-8");
  System.out.println("乱码文字的utf-8解码b2:  "+Arrays.toString(b2));
  String s2 = new String(b2,"gbk");
  System.out.println("utf-8解码后查GBK表的错误文字s2="+s2);
}
}





3 个回复

倒序浏览
你打印出的是问号,这是因为你是用的是DOS命令行
DOS支持的字符数量比较少,对图形的显示能力比较弱,有些很特殊的字符是打印不出来的,遇到这种打印不出来的字符,它就会显示“?”
如果你是用eclipse的打印窗口,就不会出现这种情况,而且打印出来的就是两个字符
如图所示,注意左下角的打印结果

2.png (30.75 KB, 下载次数: 16)

2.png
回复 使用道具 举报
并不是说,符合utf-8标准的字节就一定可以解码出字来,无论是GBK还是utf-8,他们都有很多位子是留给未知字符的.
以便将来扩展所用.而这些字符在现在来说是毫无意义的,所以也有可能识别不出来.
回复 使用道具 举报
1.毕姥爷不是说联通GBK二进制编码形式正好符合UTF-8的编码形式么,既然联通二字的GBK二进制编码形式正好符合UTF-8编码形式,那么UTF-8解码后应该是UTF-8能识别的字符啊?而程序的结果怎么对联通二字进行GBK编码后进行UTF-8解码的字符是"???",这个不理解,求高手指教!!!

联通二字的二进制符合UTF-8的编码规则,但是符合规则就一定有对应的字符。就好比汉语拼音,可能拼读出来,但却没有对应的汉子一样。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马