在jdk7和jdk8中都存在这个问题如下:try {
            String str = "上海上海";
            String gb2312 = new String(str.getBytes("utf-8"), "gb2312");
            String utf8 = new String(gb2312.getBytes("gb2312"), "utf-8");
            System.out.println(str.equals(utf8));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }打印出来是false,就是说转码不正确,请教大神们应该怎样转码?

解决方案 »

  1.   

                    String s = "上海上海";  
            byte[] b = s.getBytes("gb2312");//编码  
            String sa = new String(b, "gb2312");//解码:用什么字符集编码就用什么字符集解码  
              
            b = sa.getBytes("utf-8");//编码  
            String sa2 = new String(b, "utf-8");//解码  
            System.err.println(sa.equals(sa2)); 
      

  2.   

    不对不对,楼主你用“utf-8” 编码,用"gb2312"解码,  所以会出问题
      

  3.   

    我来说下自己的观点
     String str = "上海上海";
     String gb2312 = new String(str.getBytes("utf-8"), "gb2312");  ---此时你已经变成了了一个全新的String,你这样就再难以转换回来
      

  4.   

    import java.io.UnsupportedEncodingException;public class Test {
        public static void main(String[] args) {
         try {
                String str = "上海上海";
                byte[] bs = str.getBytes("utf-8");//utf-8,一个汉字3个字节
                for (byte b : bs) {
    System.out.print(Integer.toBinaryString(b&0xff) + " ");
    }
                System.out.println();
                
                byte[] bs1 = str.getBytes("gb2312");//gb2312,一个汉字2个字节
                for (byte b : bs1) {
    System.out.print(Integer.toBinaryString(b&0xff) + " ");
    }
                System.out.println();
                
                String gb2312 = new String(str.getBytes("utf-8"), "gb2312");
                /*
                 * str.getBytes("utf-8")是字符序列化,以utf-8的编码方式序列化
                 * new String(str.getBytes("utf-8"), "gb2312")是字符反序列化,把得到的字节数组,以gb2312的编码方式反序列化
                 * 你这得到的是乱码
                 * 字符串以什么样的方式序列化就要以同样的方式反序列化
                 */
                System.out.println(gb2312);
                String utf8 = new String(gb2312.getBytes("gb2312"), "utf-8");
                System.out.println(str.equals(utf8));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
    }
    }
      

  5.   


    再补充下,转的话需要用unicode作为中转,
    new String(str.getBytes(),"gb2312")
    这样就不会乱码
      

  6.   

    [quote=引用 2 楼 qlz522044161 编码  
            String sa = new String(b, "gb2312");//解码:用什么字符集编码就用什么字符集解码  
              
            b = sa.getBytes("utf-8");//编码  ????
      

  7.   

    这样就是true了,楼主编码和解码用的格式不一样
      

  8.   

    我开始理解了java中所有内容都是unicode,那么对于str = new String("上海".getByte("gb2312"), "gb2312")说str是一个用gb2312编码的字符串根本就是错的,因为str没有特定的编码,只是unicdoe,是这样吗?我现在要请求一个第三方接口,它需要的参数编码方式是gb2312,这里面所谓的编码方式是不是得在http请求中定义?