需求:
将一个中文字符'中', 恢复成byte[2], 然后再将其合并为String类型, 要求输出一个"中".遇到如下问题: 组合byte[]到String,失败, 小弟才疏学浅,搞不定,所以特请教大牛:运行环境默认的编码是GB2312.
char src = 0x4e2d; //中文字'中'
System.out.println("原始字符:" + src);
byte high =(byte) (src>>8);
byte low = (byte)(src);
System.out.println("高字节:" + Integer.toHexString(high));
System.out.println("低字节:" + Integer.toHexString(low));
System.out.println(new String(new byte[]{(byte)high, (byte)low}, "GB2312"));请不要修改上面的思路, 请大家帮我彻底理清楚一下java的编码.

解决方案 »

  1.   

    System.out.println("原始字符:" + src);
    这句就把src升到String类型了
      

  2.   

    整那么麻烦干什么
            String str = "中";        byte[] bt = str.getBytes("GB2312");        for (byte value : bt) {
                // print byte value.
                System.out.println(value);
            }
            System.out.println(new String(bt, "GB2312"));
      

  3.   

    4楼正解
    new String(byte[],"gb2312");
      

  4.   


            char src = 0x4e2d; //中文字'中'
            System.out.println("原始字符:" + src);
            // 不处理编码
            byte high = (byte) (src >> 8);
            byte low = (byte) (src);
            System.out.println("高字节:" + Integer.toHexString(high));
            System.out.println("低字节:" + Integer.toHexString(low));
            char c = (char) high;
            c = (char) ((c << 8) + low);
            // 不处理编码
            System.out.println(new String(new char[]{c}));        // 下面按"GB2312"处理
            String s = new String(new char[]{src});
            byte[] bb = s.getBytes("GB2312");
            System.out.println("高字节:" + Integer.toHexString(bb[0]));//Integer.toHexString(int i)
            System.out.println("低字节:" + Integer.toHexString(bb[1]));//自动转型为int
            System.out.println("高字节:" + String.format("%x",bb[0]));//%x格式化为十六进制
            System.out.println("高字节:" + String.format("%x",bb[1]));//%x格式化为十六进制
            System.out.println(new String(bb, "GB2312"));
      

  5.   

    run:
    原始字符:中
    高字节:4e
    低字节:2d

    高字节:ffffffd6
    低字节:ffffffd0
    高字节:d6
    高字节:d0

    成功生成(总时间:1 秒)
      

  6.   

    不考虑编码,你的是正byte值,转十六进制没问题,按"GB2312"解码后是负值,所以会有ffffff
      

  7.   


    同学,你把char转化String, String得到的byte,再组合的,我要的是char组成的两个byte[]直接转化为String, 以此弄清楚编码规律,你这种方式已经偏离我的本意,不过很谢谢你! 等下给你加分, 期待高手中...
      

  8.   


    同学,你的想法已经错了,char本身是两个byte不错,可是char编码是UTF-16而且有部分字符需要int才行,就是两个代码点(两个char)。仔细看一下api吧
      

  9.   

    String 本身也是UTF-16编码,有些字符需要两个char,API节选:Unicode 字符表示形式
    char 数据类型(和 Character 对象封装的值)基于原始的 Unicode 规范,将字符定义为固定宽度的 16 位实体。Unicode 标准曾做过修改,以允许那些其表示形式需要超过 16 位的字符。合法代码点 的范围现在是从 U+0000 到 U+10FFFF,即通常所说的 Unicode 标量值。(请参阅 Unicode 标准中 U+n 表示法的定义。) 从 U+0000 到 U+FFFF 的字符集有时也称为 Basic Multilingual Plane (BMP)。代码点大于 U+FFFF 的字符称为增补字符。Java 2 平台在 char 数组以及 String 和 StringBuffer 类中使用 UTF-16 表示形式。在这种表现形式中,增补字符表示为一对 char 值,第一个值取自高代理项 范围,即 (\uD800-\uDBFF),第二个值取自低代理项 范围,即 (\uDC00-\uDFFF)。 
      

  10.   


            char src = 0x4e2d; //中文字'中'
            System.out.println("原始字符:" + src);
            byte high = (byte) (src >> 8);
            byte low = (byte) (src);
            System.out.println("高字节:" + Integer.toHexString(high));
            System.out.println("低字节:" + Integer.toHexString(low));
    //        System.out.println(new String(new byte[]{(byte)high, (byte)low}, "GB2312"));
            System.out.println(new String(new byte[]{high, low}, "UTF16"));
    还用你的代码吧,只需要把GB2312改为UTF16
    输出结果:
    run:
    原始字符:中
    高字节:4e
    低字节:2d

    成功生成(总时间:0 秒)
      

  11.   

    哦,搞了半天,你0x4e2d就不是用GB2312编码的,怎么用它解码?
      

  12.   


    you get it! 确实如此! 多谢兄弟!
      

  13.   

    围观和打酱油的, 给一分给的答案比较模糊,不详细的2分.其余的分给Niubility兄弟