黑马程序员技术交流社区

标题: 编码 [打印本页]

作者: 朱烈葵    时间: 2012-7-29 17:00
标题: 编码
编码···

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再去找九个字节,就是四个汉字外加半个出现了锟斤拷锟? 这可以理解。

只有一种解释..就是???这三个是不需要三个字节来对应一个的?。要不然无法解释了。
作者: 朱烈葵    时间: 2012-7-29 19:44
哎呀,识货的人还是有的呢 呵呵,韦老大 谢谢了
作者: 陆强强    时间: 2012-7-29 20:34
utf-8一个字母还是8位一个字节,一个汉字是24位也就是三个字节,所以“你好”先被GBK解码成4个字节。
然后再UTF-8编码过来就是一个汉字的三个字节,多出的一个字节不能被编成汉字就丢弃了。
至于为什么是问号。因为打印语句用的还是默认的GBK,所以无法显示出来。
作者: 尤洋    时间: 2012-7-29 20:34
utf-8编码并不是按一个字符对应三个字节,它是一种变长的编码方式,根据不同的符号而变化字节长度。
所以3个字符对应的是6-9个字节
我是这样理解的,希望能对你有所帮助

作者: 吴立杰    时间: 2012-7-29 20:36
?其实是占位符,代表这个位置上是有东西的,但是系统不知道是什么东西。还有谁说utf-8只规定是3个字节一个字符了,UTF-8实际上是用1到6个字节编码UNICODE字符的,所以是???没什么奇怪的了
作者: 朱烈葵    时间: 2012-7-29 21:07
吴立杰 发表于 2012-7-29 20:36
?其实是占位符,代表这个位置上是有东西的,但是系统不知道是什么东西。还有谁说utf-8只规定是3个字节一个 ...

哦 这样的,明白了,谢谢了 不魁技术分那么高, 服了
作者: 朱烈葵    时间: 2012-7-29 21:08
尤洋 发表于 2012-7-29 20:34
utf-8编码并不是按一个字符对应三个字节,它是一种变长的编码方式,根据不同的符号而变化字节长度。
所以3 ...

谢谢了,非常感谢
作者: 高薇    时间: 2012-7-29 22:04
路过,不明白{:soso_e154:}
作者: 王志明    时间: 2012-7-29 22:23
utf-8编码的字符占三个字节,“你好”将GBK解码为utf-8后变成了9个字节,再将其utf-8编码,然后再gbk解码,又变成4个字节,但是数据已经不是原来的了
作者: 陈欢    时间: 2012-7-29 22:34
这个是两种编码形式的区别,utf-8编码不一定是一个字符对应三个字节,可能是两个也可能是三个,他是一种可变的编码形式,符号不同字节也是有变化的,所以3个字符对应的字节也是不确定的了。好多人人遇到这种问题,跟自己编码的习惯和使用的工具都有关
作者: 王峰    时间: 2012-7-30 15:44
你这样理解吧,utf-8编码并不是按一个字符对应三个字节,其实它是一种变长的编码方式,
它会根据不同的符号而变化字节长度。因此3个字符对应的是6-9个字节





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