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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 代文娟 中级黑马   /  2013-12-6 17:45  /  1734 人查看  /  2 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.io.UnsupportedEncodingException;
  2. import java.util.Arrays;
  3. public class CodeDemo {
  4.         public static void main(String[] args) throws UnsupportedEncodingException {
  5.                 String s="你好";
  6.                 byte[] b = s.getBytes("gbk");
  7.                 System.out.println(Arrays.toString(b));
  8.          System.out.println(new String(b,"UTF-8"));
  9.         }
  10. }
复制代码

为什么运行后的结果为???三个问号,而不是两个问号呢?[-60, -29, -70, -61]他不是应该拿三个字节去查吗,拿查出来的不应该是两个问号吗?

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

2 个回复

倒序浏览
本帖最后由 wangchao1686 于 2013-12-6 19:03 编辑

很明显,出现了乱码,对于你的问题,首先,要先了解一下UTF-8的编码规则。
UTF-8编码不是使用等长的字节数表示一个字符。它表示一个字符是可能要1个,2个,或者3个字节甚至到6字节才能表示一个字符。现在只说明3个以内的。具体的规则如下。
    utf-8码                  byte数
0XXX XXXX                    1

110X XXXX
10XX XXXX                    2


1110  XXXX
10XX XXXX                    3
10XX XXXX



“你好”的gbk编码化成二进制是:
[11000100,11100011,10111010,11000011]
1,可以看到第一个字节是以110打头的,就是说要两个字节才能表示一个字节,而且紧接着字节是10打头的才可以。
  但是后边的1110打头的。在utf-8中没有查到,输出第一个?。
2,第二个字节是1110打头,要后边接两个10打头的字节才可以查到一个字符。但是第四个是110打头的。有没有找到对应的字符,输出第二个?
3,我想,输出的第3个?,你也明白了吧。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
多谢了!明白了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马