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条)

报告相同问题?

悬赏问题

  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码