黑马程序员技术交流社区
标题:
有关编码的问题
[打印本页]
作者:
代文娟
时间:
2013-12-6 17:45
标题:
有关编码的问题
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
public class CodeDemo {
public static void main(String[] args) throws UnsupportedEncodingException {
String s="你好";
byte[] b = s.getBytes("gbk");
System.out.println(Arrays.toString(b));
System.out.println(new String(b,"UTF-8"));
}
}
复制代码
为什么运行后的结果为???三个问号,而不是两个问号呢?[-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数
0
XXX XXXX 1
110
X XXXX
10
XX XXXX 2
1110
XXXX
10
XX XXXX 3
10
XX 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