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解释了中文字符后,为何恢复不回去了? 请将详细写吧。
...全文
1512 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)

62,614

社区成员

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

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