isuifengfei 2012-11-07 10:39
浏览 218
已采纳

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[]

  • 写回答

6条回答 默认 最新

  • cpszgy 2012-11-08 12:23
    关注

    这种实现是不可能的。
    主要是你通过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解码的话就无法解析回去了。都会映射到那个特殊字符的编码。这样字节已经丢失。
    有的时候这种你转换可行是因为某种编码生成的字节刚好再另外一种编码的字节范围内。那么字节不会丢失。这样就可以逆转换回来。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题