上一篇中我描写了一些字符串乱码的原因,同时也补了一个乱码转码的方法。
这篇我们来探讨这个方法的一些局限性。。废话不说,先上代码
String strDefalt = "";
String strDefaltEncode = "";
try {
strDefalt = "我的心不乱";
strDefaltEncode = new String("我的心不乱".getBytes(),"utf-8");
String temp = new String(strDefaltEncode.getBytes("utf-8"),"gbk");
System.out.println("temp="+temp);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Default charsetName="+Charset.defaultCharset().name());
System.out.println("strDefalt="+strDefalt);
System.out.println("strDefaltEncode="+strDefaltEncode)
显示结果为
temp=锟揭碉拷锟侥诧拷锟斤拷
Default charsetName=GBK
strDefalt=我的心不乱
strDefaltEncode=????????
strChangeEncode=???拷???拷?斤拷
在这次转码时字符串并没有如预想的一样转化为正确的字符,还是出现了乱码。
String strDefalt = "";
String strDefaltEncode = "";
String changeEncode = "";
try {
strDefalt = "我的心不乱";
strDefaltEncode = new String("我的心不乱".getBytes(),"utf-8");
changeEncode = new String("我的心不乱".getBytes(),"shift-jis");
System.out.println("strDefalt ");
for(byte b : strDefalt.getBytes()){
System.out.print(b+",");
}
System.out.println();
System.out.println("strDefaltEncode ");
for(byte b : strDefaltEncode.getBytes("utf-8")){
System.out.print(b+",");
}
System.out.println();
System.out.println("changeEncode ");
for(byte b : changeEncode.getBytes("shift-jis")){
System.out.print(b+",");
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
显示结果如下
strDefalt
-50,-46,-75,-60,-48,-60,-78,-69,-62,-46,
strDefaltEncode
-17,-65,-67,-46,-75,-17,-65,-67,-17,-65,-67,-60,-78,-17,-65,-67,-17,-65,-67,-17,-65,-67,
changeEncode
-50,-46,-75,-60,-48,-60,-78,-69,-62,-46,
代码显示平台默认的gbk的byte数组和错转为utf-8再转回来的明显不一样。
而错转为shift-jis的再转回来和远byte数组则是一样的。
为什么会出错的原因我具体也不是很清楚,但据我目前的知识我只能解释为utf-8的数字格式并不固定,有可能是这个原因导致错转为utf-8后就污染了原来的byte数组。
这一块还希望各位达人牛人来指导,指正。