黑马程序员技术交流社区

标题: 有关编码的问题 [打印本页]

作者: 代文娟    时间: 2013-12-6 17:45
标题: 有关编码的问题
  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]他不是应该拿三个字节去查吗,拿查出来的不应该是两个问号吗?
作者: wangchao1686    时间: 2013-12-6 18:20
本帖最后由 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个?,你也明白了吧。

作者: 代文娟    时间: 2013-12-7 08:24
多谢了!明白了!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2