Java转码问题

String str = "你好";
byte[] byteGBK = str.getBytes("GBK");

String str1 = new String(byteGBK,"UTF-8");
System.out.println( str1 );

// 这个时候str1会显示成乱码
// 开始我写成
byte[] tmpUTF8 = str1.getBytes("UTF-8");
String str2 = new String(tmpUTF8,"GBK");
System.out.println( str2 );
// 这个时候 str2 还是乱码

//需求是我现在只能够拿到 str1,应该如何装换才能不是乱码,或者说,如果从str1中取得 没有污染的 byte[]

这种实现是不可能的。
主要是你通过GBK得到的字节,然后再用UTF-8去转换的话。
除非你的字节刚好在UTF-8编码的范围里面。

0XXX XXXX​

110X XXXX

10XX XXXX

1110 XXXX
10XX XXXX

10XX XXXX

1111 0XXX
10XX XXXX
10XX XXXX

10XX XXXX

1111 10XX
10XX XXXX
10XX XXXX
10XX XXXX

10XX XXXX

1111 110X
10XX XXXX
10XX XXXX
10XX XXXX

10XX XXXX

如果你用GBK解码得到的字节组合不在以上的组合里,那么你这个字节对应的UTF-8的字符会变成一个特殊的,然后再通过UTF-8解码的话就无法解析回去了。都会映射到那个特殊字符的编码。这样字节已经丢失。
有的时候这种你转换可行是因为某种编码生成的字节刚好再另外一种编码的字节范围内。那么字节不会丢失。这样就可以逆转换回来。

你确定str1是GBK编码?有没有可能是GB2312,或者说本来就是UTF-8?
看看这里[url]http://simlee.iteye.com/blog/431611[/url]能否帮到你。

System.out.println(byteGBK.length);
System.out.println( byteGBK[0]+" " +byteGBK[1]+" " +byteGBK[2]+" " +byteGBK[3]+" " );
System.out.println(tmpUTF8.length);
System.out.println( tmpUTF8[0]+" " +tmpUTF8[1]+" " +tmpUTF8[2]+" " +tmpUTF8[3]+" " );

你输出看看就明白了...

byte[] byteGBK = str.getBytes("UTF-8");

String str1 = new String(byteGBK,"UTF-8");

这里获取byte数组的编码和new的编码要一致的

String newName = new String(parameterValue.getBytes(System.getProperty("file.encoding")), "UTF-8");

试试这个哈。

你把这两个方法的意思完全都理解错了,getBytes和new String(encoding)不是用来转码的。

String str = "你好";
byte[] byteGBK = str.getBytes("GBK");
是说用GBK的编码对"你好"进行编码,编码成byte数组

String str1 = new String(byteGBK,"UTF-8");
是说用UTF-8的编码对刚才的byte数组进行解码成字符串

一个GBK编码的字节数组用UTF-8去解码肯定是乱码嘛

楼主对编码的基本知识看来还是有待补充哦。
JVM里都是采用UTF-16编码的。

String str = "你好";
byte[] byteGBK = str.getBytes("GBK");
这两句的意思是将jvm内部UTF-16的字符编码转换成GBK编码的字节数组。

String str1 = new String(byteGBK,"UTF-8");
System.out.println( str1 );

而这两句你又将是GBK编码的字节数组当做UTF-18来解码,自然会是乱码。

其实你理解了编码的原理就不会有疑问了,可以看我的博客,可以解决你的疑惑:http://singleant.iteye.com/blog/686383