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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 禅伤 中级黑马   /  2014-8-4 14:47  /  1325 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

直接先上代码:
//编码
                String s="你好";
                byte[] b=s.getBytes();//编码,默认gbk编码
                String s1=new String(b,"iso8859-1");//解码
                System.out.println(Arrays.toString(b));
                System.out.println(s1);
               
                //采用iso8859-1编码并获取字节组
                byte[] b1=s1.getBytes("iso8859-1");//编码
                String s2=new String(b1,"utf-8");//解码
                System.out.println(Arrays.toString(b1));
                System.out.println(s2);


输出结果:
[-60, -29, -70, -61]
????
[-60, -29, -70, -61]
???

问:        byte[] b1=s1.getBytes("iso8859-1");//采用“iso8859-1"编码后获得字节数组[-60, -29, -70, -61]后 再采用”utf-8“格式进行解码应该是3个字节一个字符吧,因此最多应该有两个未识别的问号吧 为什么有3个?

4 个回复

倒序浏览
utf-8的编码长度从1-3不等,所以有可能出现3个问号
回复 使用道具 举报
GBK--->ISO-8859-1--->UTF-8
UTF-8--->ISO-8859-1--->GBK
的字节直接转码则可能导致乱码,需要另外的转换过程。
byte[] b1=s1.getBytes("iso8859-1");//编码
String s2=new String(b1,"utf-8");//解码
在iso8859-1中同样是4个原始字节,但是已经是乱码了,于是utf-8就有些每3个一组进行解析,有些每个1组进行解析,有些每2个一组进行解析,于是原来4个字节的数据无法正常的解析成UTF-8的数据,所以也是乱码,是3个?
回复 使用道具 举报
fantacyleo 发表于 2014-8-4 16:22
utf-8的编码长度从1-3不等,所以有可能出现3个问号

我也知道这个,但什么情况下会出现3个问号?
回复 使用道具 举报
禅伤 发表于 2014-8-4 16:58
我也知道这个,但什么情况下会出现3个问号?

既然1-3字节都可以形成编码,那么3个问号不是很容易解释么?比如-60 、-29分别对应1个问号。-70和-
61合起来对应一个问号。当然,具体的对应得去查码表和编码规则了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马