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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 朱烈葵 中级黑马   /  2012-7-29 17:00  /  2930 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

编码···

public static void menthod() throws IOException
        {
                String s = "你好";

                byte[] b1 =  s.getBytes("GBK");                                             //对指定的字符处进行编码

                System.out.println(Arrays.toString(b1));                                //返回指定数组内容的字符串表示形式。
                String s1 = new String(b1,"utf-8");                                                //解码错了

                System.out.println("s1="+s1);


                byte[] b2 = s1.getBytes("utf-8");                                                //再次编码到数组中
                System.out.println(Arrays.toString(b2));                                //再次编码后的字节数组
                String s2 = new String(b2,"GBK");                                                //解码

                System.out.println("s2=="+s2);
               
        }
}
/*
[-60, -29, -70, -61]
s1=???
[-17, -65, -67, -17, -65, -67, -17, -65, -67]
s2==锟斤拷锟?

这个问题我不得不说下····,困惑我很久
拿GBK编码出现[-60, -29, -70, -61]
按utf-8解码出现???这是什么呢?这是三个字符(困惑的地方是utf-8解码是按一个字符三个字节,那这三个???是三个字符啊,那就是要9个字节去才能找出这???问号这是怎么找出三个的呢?按道理最多是两个问号才对啊?),既然是三个字符。那gbk再去找九个字节,就是四个汉字外加半个出现了锟斤拷锟? 这可以理解。

只有一种解释..就是???这三个是不需要三个字节来对应一个的?。要不然无法解释了。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

10 个回复

倒序浏览
哎呀,识货的人还是有的呢 呵呵,韦老大 谢谢了
回复 使用道具 举报
utf-8一个字母还是8位一个字节,一个汉字是24位也就是三个字节,所以“你好”先被GBK解码成4个字节。
然后再UTF-8编码过来就是一个汉字的三个字节,多出的一个字节不能被编成汉字就丢弃了。
至于为什么是问号。因为打印语句用的还是默认的GBK,所以无法显示出来。
回复 使用道具 举报
utf-8编码并不是按一个字符对应三个字节,它是一种变长的编码方式,根据不同的符号而变化字节长度。
所以3个字符对应的是6-9个字节
我是这样理解的,希望能对你有所帮助

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
?其实是占位符,代表这个位置上是有东西的,但是系统不知道是什么东西。还有谁说utf-8只规定是3个字节一个字符了,UTF-8实际上是用1到6个字节编码UNICODE字符的,所以是???没什么奇怪的了

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
吴立杰 发表于 2012-7-29 20:36
?其实是占位符,代表这个位置上是有东西的,但是系统不知道是什么东西。还有谁说utf-8只规定是3个字节一个 ...

哦 这样的,明白了,谢谢了 不魁技术分那么高, 服了
回复 使用道具 举报
尤洋 发表于 2012-7-29 20:34
utf-8编码并不是按一个字符对应三个字节,它是一种变长的编码方式,根据不同的符号而变化字节长度。
所以3 ...

谢谢了,非常感谢
回复 使用道具 举报
高薇 中级黑马 2012-7-29 22:04:10
8#
路过,不明白{:soso_e154:}
回复 使用道具 举报
utf-8编码的字符占三个字节,“你好”将GBK解码为utf-8后变成了9个字节,再将其utf-8编码,然后再gbk解码,又变成4个字节,但是数据已经不是原来的了
回复 使用道具 举报
这个是两种编码形式的区别,utf-8编码不一定是一个字符对应三个字节,可能是两个也可能是三个,他是一种可变的编码形式,符号不同字节也是有变化的,所以3个字符对应的字节也是不确定的了。好多人人遇到这种问题,跟自己编码的习惯和使用的工具都有关
回复 使用道具 举报
你这样理解吧,utf-8编码并不是按一个字符对应三个字节,其实它是一种变长的编码方式,
它会根据不同的符号而变化字节长度。因此3个字符对应的是6-9个字节
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马