自认为很有意思的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处:为什么我输出的是--锟劫猴拷 展开
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处:为什么我输出的是--锟劫猴拷 展开
5个回答
展开全部
个人认为问题并不是出在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”解释出来的东西就不同了。
一家之言,欢迎讨论
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双向正确的转换。
展开全部
个人 理解:因为utf-8的范围比GB2312 的范围大!
就好比 你先将integer 转化为float ,之后再将 float 转换为 integer ,是会缺失精度的。
把小盒子可以装进大盒子,但是将大盒子装进小盒子,只能装进大盒子的一部分,这样就会出问题...
就好比 你先将integer 转化为float ,之后再将 float 转换为 integer ,是会缺失精度的。
把小盒子可以装进大盒子,但是将大盒子装进小盒子,只能装进大盒子的一部分,这样就会出问题...
追问
我也是这么认为的,只是想知道的更详细些。比如说底层是怎么转的,在哪里失了精度,就转不回来了。
追答
要了解底层 跟进去 float 转换 Ingeter 的 方法 intValue() 跟进去看源码 就知道了!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
其实你换个角度想下就能相通了。
嘿嘿 显示被转成了 UTF-8 已经变成了未知字符。
而未知字符再被转换成GB2312 依然是未知字符
嘿嘿 显示被转成了 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]
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不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$
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不知道你转换完之后有没有重启服务。
追问
我是写在main中测试的。。。
追答
你是在myeclipse里写的还是直接用命令行运行的呢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询