自认为很有意思的java编码问题,弄不明白,大家来帮忙看看。

Stringstr="嘿嘿";str=newString(str.getBytes("GB2312"));System.out.println(str);//1str=n... String str = "嘿嘿";
str = new String(str.getBytes("GB2312"));
System.out.println(str);//1
str = new String(str.getBytes("GB2312"), "UTF-8");//2
str = new String(str.getBytes("UTF-8"), "GB2312");//3
System.out.println(str);//4

字符串的初始编码是GB2312
我在1处:输出了--嘿嘿
2处:我由GB2312转成了UTF-8
3处:我由UTF-8又转回了GB2312
4处:为什么我输出的是--锟劫猴拷
展开
 我来答
周宅伦
2011-10-28 · TA获得超过121个赞
知道答主
回答量:89
采纳率:0%
帮助的人:143万
展开全部
个人认为问题并不是出在utf-8和gb2312的转换上,而是出在utf-8和unicode相互的转换上,我的想法:
1处:没啥好说的,str.getBytes("GB2312")得到的是“嘿嘿”gb2312的字节数组,然后用系统默认字符集gb2312来解释这个字节数组当然还是原样的东西。

2处:问题就出在这里,这里实际上是把str.getBytes("GB2312")得到的gb2312字节数组当做utf-8的字节数组转换成java内部使用的unicode并放到内存中,也就是把字节数组{-70,-39,-70,-39}转换成了unicode字节数组{-2, -1, -1, -3, 6, 122, -1, -3}按照我的理解这个过程是不可逆的,具体为什么不可逆,我想这是和unicode utf-8之间的转换方式有关。

3处:这一步str.getBytes("utf-8")得到的已经不是原先的字节数组{-70,-39,-70,-39}了,变成了{-17 ,-65 ,-67, -39 ,-70, -17, -65, -67 },原因就是上边说的不可逆性。

4处:字节数组都不一样了,当然用“gb2312”解释出来的东西就不同了。

一家之言,欢迎讨论
追问
我查了下,unicode和utf-8是可以相互转换的。
追答
当然是可以相互转换的。我的意思是可以正确的逆向转换必须要有一个前提,这个前提就是原始的字节数组必须要有意义,或者说对于这个字节数组能用utf-8解释出一个有意义的字符序列,这样才能正确转换成unicode。这也是为什么你用iso8859-1可以的原因,因为这个字符集都是单字节的,任何字节数组都可以解释成有意义的字符序列,也就可以和unicode双向正确的转换。
农夫喝山泉
2011-10-28 · TA获得超过116个赞
知道答主
回答量:111
采纳率:100%
帮助的人:53万
展开全部
个人 理解:因为utf-8的范围比GB2312 的范围大!
就好比 你先将integer 转化为float ,之后再将 float 转换为 integer ,是会缺失精度的。
把小盒子可以装进大盒子,但是将大盒子装进小盒子,只能装进大盒子的一部分,这样就会出问题...
追问
我也是这么认为的,只是想知道的更详细些。比如说底层是怎么转的,在哪里失了精度,就转不回来了。
追答
要了解底层 跟进去 float 转换 Ingeter 的 方法  intValue()  跟进去看源码 就知道了!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友6cde26a
2011-10-28 · TA获得超过110个赞
知道小有建树答主
回答量:252
采纳率:0%
帮助的人:131万
展开全部
其实你换个角度想下就能相通了。
嘿嘿 显示被转成了 UTF-8 已经变成了未知字符。
而未知字符再被转换成GB2312 依然是未知字符
追问
我转成iso8859-1是未知字符,再转回来就对了。
追答
在UTF-8,与UNICODE之间转换的时候,用二进制运算,代替了字符串的转换。UTF-8一个汉字,用3个字节,而UNICODE用2个字节;对应关系如下:

UTF-8编码:
[1,1,1,0,A5,A6,A7,A8], [1,0,B3,B4,B5,B6,B7,B8],
[1,0,C3,C4,C5,C6,C7,C8];

对应的UNICODE编码:

[A5,A6,A7,A8,B3,B4,B5,B6],
[B7,B8,C3,C4,C5,C6,C7,C8]
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
pajmescy
2011-10-28 · 贡献了超过116个回答
知道答主
回答量:116
采纳率:0%
帮助的人:54.3万
展开全部
不k能把非整数的字符串直接转为8整数 这题如果你这样改就可以4了y int i = Integer。parseInt("43"); System。out。println("the d convert to int is :"+i); 不c能带有小v数点转型。或者下r次你先转为6double,再通过强制转化3为5int String strDouble = String。valueOf(d); String str="153。2"; int i = (int)Double。parseDouble(str); System。out。println("the d convert to int is :"+i); 楼主看一x下e错误提示4也v晓得了w。。。。 rpほy吱xΦфtv悭q〖l┰ke$
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
albee919
2011-10-28 · TA获得超过169个赞
知道答主
回答量:113
采纳率:0%
帮助的人:59.9万
展开全部
不知道你转换完之后有没有重启服务。
追问
我是写在main中测试的。。。
追答
你是在myeclipse里写的还是直接用命令行运行的呢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式