java 编码转换问题,怎么用utf-8解释后,就转换不回去了呢?

tulugan 2009-08-22 02:55:10
String str = "中";


String str1 = new String(str.getBytes("gbk"), "ISO8859-1");
String str2 = new String(str1.getBytes("ISO8859-1"), "gbk");
System.out.println(str2); //输出"中"


String s1 = new String(str.getBytes("gbk"), "utf-8");
String s2 = new String(s1.getBytes("utf-8"), "gbk");
System.out.println(s2); //输出"锟斤拷"

使用iso8859-1进行解释后,可以恢复回去,
可使用utf-8解释了中文字符后,为何恢复不回去了? 请将详细写吧。
...全文
1513 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
tulugan 2009-08-25
  • 打赏
  • 举报
回复
乖,快去
  • 打赏
  • 举报
回复
我已经向管理员投诉了
  • 打赏
  • 举报
回复
44.44% 的结帖率,我看我是瞎了我的两粒才来回复的!
  • 打赏
  • 举报
回复 1
辛辛苦苦从头到尾地回复,竟落到如此下场,可悲!
  • 打赏
  • 举报
回复
你这人说话怎么这样啊?
tulugan 2009-08-25
  • 打赏
  • 举报
回复
你耍什么大牌啊
  • 打赏
  • 举报
回复
我感觉你对编码的知识几乎为零,建议找这方面的资料去研究一下。
  • 打赏
  • 举报
回复
ISO 8859-1 只采用一个字节来表示字符,当然可以按字节来拆。

但是像 GBK,UTF-8 的字符是采用多字节来表示,多字节的话就必须有规范,否则编码就会乱套
tulugan 2009-08-25
  • 打赏
  • 举报
回复
那为什么ISO8859-1解码不出来就不去改变原来的字节数据呢?

String s = "中";
byte[] bytes = s.getBytes("GBK");
for(byte b : bytes) System.out.println(b);

String s2 = new String(bytes, "ISO8859-1");
System.out.println(s2);
byte[] bytes2 = s2.getBytes("ISO8859-1");
for(byte b : bytes2) System.out.println(b);
  • 打赏
  • 举报
回复
不认识的字符,用其他的字符去代替我认为这并没什么不好的地方!
tulugan 2009-08-25
  • 打赏
  • 举报
回复
请问为什么UTF-8解码不出来却要去改变原字节数据?这样设计的目的是何?
tulugan 2009-08-24
  • 打赏
  • 举报
回复
请问这个图怎么看啊
gbk和图中的unicode utf-8有什么关系啊?

Unicode Code UTF-8 Code
0000~007F 0xxxxxxx
0080~07FF 110xxxxx 10xxxxxx
0800~FFFF 1110xxxx 10xxxxxx 10xxxxxx
10000~10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
  • 打赏
  • 举报
回复
Unicode Code    UTF-8 Code
0000~007F 0xxxxxxx
0080~07FF 110xxxxx 10xxxxxx
0800~FFFF 1110xxxx 10xxxxxx 10xxxxxx
10000~10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx


这个图怎么看?

左边一列是 Unicode 编码,右边一列是 UTF-8 编码。我们只要看右边的,右边的是 UTF-8 的编码规则,
即:

第一行 0xxxxxxx 表示 U+0000~U+007F 的字符,UTF-8 使用一个字节表示
第二行表示 U+0080~U+07FF 的字符,UTF-8 编码使用两个字节表示,首字节必须是 110 开头,第二个字节必须是以 10 开头的,也就是说如果第一个字节是以 110 开头的,但是第二个字节是以 11 开头的,那么这样的字节是不能组成 UTF-8 编码的,会采用缺失字符代替。


好了,该说的都已经说完了,对于这个帖子不会再回复了。
  • 打赏
  • 举报
回复
你真的不知道再该怎么回答了!
-----------------------------------
打错了:我真的不知道再该怎么回答了!


[Quote=引用 12 楼 tulugan 的回复:]
不回答就算了
[/Quote]

哎!
  • 打赏
  • 举报
回复
我已经回复得够详细了,你真的不知道再该怎么回答了!
tulugan 2009-08-24
  • 打赏
  • 举报
回复
不回答就算了
  • 打赏
  • 举报
回复
说实在的,楼主对自己的帖子不负责任,两天后才出来说一句话
  • 打赏
  • 举报
回复
这个表只是 UTF-8 的编码规则,跟 GBK 没有丝毫关系
  • 打赏
  • 举报
回复
这是由于在 GBK 转成 UTF-8 时就产生了错误,具体为什么会错误,请先看看
楼上那个帖子 11 楼的内容,将在那些基础上进行说明。

因为“中”的 GBK 编码为 D6D0,使用 getBytes("gbk") 后会转成 D6 D0 的字节数组。

通过那个帖子关于 UTF-8 的编码规则表,先看第一个字节 D6,二进制为 11010110,因此可用的 UTF-8
采用第二行的规则,即:110xxxxx 10xxxxxx,根据这一行规则,要求第二个字节二进制是以 10 开头的,
但是我们第二个字节 D0 的二进制为 11010000,因此不符合 UTF-8 的编码规则,因此将采用 UTF-8 的
缺失字符 EF BF BD 将其进行编码,因为 D6 D0 这两个字节 UTF-8 都不认识,因此被 UTF-8 编码成为
EF BF BD EF BF BD 共 6 个字节的两个缺失字符。

这 6 个字符再根据 GBK 的编码规则,每两个组成一个字符,因此被 GBK 编码为 EFBF BDEF BFBD,而编
码为这三个的 GBK 字符正好为“锟斤拷”。
  • 打赏
  • 举报
回复
你这个帖子跟这个帖子问题类似,有趣的话可以去看看:

http://topic.csdn.net/u/20080623/16/e0f44f00-eaf9-4d38-b325-a3cc443f2ec9.html
加载更多回复(6)
前导课程:      《Java工程师系列课程》前4部 课程内容:           本课程是《Java工程师系列课程》的第8部分,深入讲解Java文件和IO流的相关知识。以下是本课程的内容展示:课程共69个小节,分为三个大部分:分别是文件部分、流部分和实战项目部分。文件部分,就是左上角用红框框起来的这一部分,主要讲解对文件以及文件夹的操作,第二部分就是课程最重要的部分,也是占课程比例最大的流部分,所谓流就是用来读写数据的类。本课程用45小节的时间为学员详细讲解各种流的使用方法以及注意事项。第三部分是实战项目部分,就是右下角用蓝色方框框起来的部分,在这一部分中,将为大家讲解如何用swing技术配合课程中学习的IO流去完成一个记事本项目。实际上,除了课程最后的这记事本项目,课程中还穿插了一些规模比较小的实战项目,比如分割文件、合并文件、给文件加密这样的小项目,以及压缩和解压文件项目。课程特点:1、讲解详细:不仅仅详细讲解了文件和流的各种用法,还讲解了很多使用过程中需要注意的细节。2、干货足量:每一个小节的时长基本都超过了20分钟,能让学员学到很多知识。3、深入解决实际问题:视频课程不仅讲解理论知识,还深入解决了很多实际问题,例如:讲解如何通过程序判断一个文件的编码格式、如何设置文件读写权限等4、讲解经典算法:例如讲解缓冲区的管理机制,能让学员学到前辈们的精华思想5、理论结合实践:课程在文件压缩和解压、文件分割以及合并、文件加密,这些小节都配有对应的实战项目,最后还有一个规模比较大的记事本项目6、手写代码:全程手写代码完成项目预期效果:      认真学习完本课程,学员可以深入掌握Java语言操作和管理磁盘文件的技术以及通过流读写数据的技术,实实在在提高实战水平,完成从菜鸟到高手的华丽转变。

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧