为了账号安全,请及时绑定邮箱和手机立即绑定

编码在解码逆着顺序就可以了吗?

编码在解码逆着顺序就可以了吗?

慕姐8265434 2019-03-12 13:14:01
编码的程序是String tempS = new String(resutlBytesData[p], "UTF-16BE");byte[] btmp = tempS.getBytes("GBK");System.out.println(Base64.encode(btmp));然后我解码的顺序是byte[] b1 = Base64.decode(s1);String ss1 = new String(b1,"GBK");byte[] bb1 = ss1.getBytes("UTF-16BE");bb1解出来后是resutlBytesData[p],但是不对?哪里出错了吗? 完整的代码如下public class anotherTest {public static void main(String[] args) throws UnsupportedEncodingException {    byte[] bytes = {6, 8, 4, 0, 1, 2, 1, 117, 49, 78, -114, 78, 14, 123, 44, 78, 9, 101, -71, 84, 8, 79, 92, -116, 3, 101, 116, -1, 12, 102, -126, 80, 92, -117, -35, -115, 57, 101, 47, 78, -40, 81, 81, 99, 98, 98, 75, 103, 58, 101, 47, 78, -40, 117, 53, 91, 80, 82, 56, -1, 8, 84, 43, 81, 108, 78, -92, 78, 0, 83, 97, -112, 26, 117, 53, 91, 80, 82, 56, -1, 9, 78, 26, 82, -95, 48, 2, -117, -9, 96, -88, -112, 9, 98, -23, 81, 118, 78, -42, 83, -17, -115, 45, 78, 112, 78, -89, 84, -63, 48, 2, -117, -35, -115, 57, 101, 47, 78, -40, 83, -17, -115, 45, 78, 112, 118, -124};    System.out.println("解码前:"+Arrays.toString(bytes));    String tempS = new String(bytes, "UTF-16BE");//得到的tempS就是乱码了    byte[] btmp = tempS.getBytes("GBK");    String result = Base64.encode(btmp);    byte[] rBtemp = Base64.decode(result);    String rTempS = new String(rBtemp,"GBK");    byte[] rBytes = rTempS.getBytes("UTF-16BE");    System.out.println("解码后:"+Arrays.toString(rBytes));}}
查看完整描述

1 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

bytes数组UTF-16BE编码后得到的String乱码,说明bytes数组的初始编码不是UTF-16BE,这个编码过程失败了。另外UTF-16BE与GBK的编码规则不同,是不兼容的,这样转换后,也会出错。


UTF-16编码是定长编码。统一以2个byte表示所有单个字符,不管是英文还是中文。


UTF-8是变长编码,ASCII字符以一个byte表示,中文字符以3个byte表示。


GB2312也是变长编码,ASCII字符以一个byte表示,中文字符以2个byte表示,GBK是GB2312的扩展,扩展了编码范围。

不同的编码规则,不同的编码范围,导致字符被翻译成字节后,会有信息丢失;同理,也会导致编码后的字节流被重组成字符后,出现乱码。

PS:可以参考这篇文章,还不错:深入分析Java中的中文编码问题


查看完整回答
反对 回复 2019-04-15
  • 1 回答
  • 0 关注
  • 319 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信