Windows与Linux下Base64编码问题

  • Post author:
  • Post category:linux


Java中,String有很多个构造方法,其中有三个如下图所示:

部分String构造方法

人们习惯性喜欢使用没有字符集的构造方法,因为简单!而我也正是犯了同样的错误!

先贴出代码:

System.out.println("````````````````````````````````````" + new String(userQues.getBytes("GBK")));
System.out.println("````````````````````````````````````" + new String(Base64.decodeBase64(userQues.getBytes("GBK"))));
System.out.println("````````````````````````````````````" + Base64.encodeBase64String(new String(Base64.decodeBase64(userQues.getBytes("GBK"))).getBytes("GBK")));

这段代码在本地windows环境下运行正常,结果如图:

windows运行结果

但是部署到linux环境后,出现结果却很奇怪:

linux运行结果

这说明第一次new String()的时候,字符集就出现了问题,导致base64解码失败,进一步编码也就和初始编码字符串不一致了!

于是查看两个系统的编码集结果如下

Windows:

Windows环境编码信息

936代表的编码格式就是GBK

Linux:

Linux环境编码信息

linux的系统编码为UTF-8

问题查出来就好解决了!

对代码进一步优化,减少对系统编码的依赖:

System.out.println("````````````````````````````````````" + new String(userQues.getBytes("GBK")));
System.out.println("````````````````````````````````````" + new String(Base64.decodeBase64(userQues.getBytes("GBK")), "GBK"));
System.out.println("````````````````````````````````````" + Base64.encodeBase64String(new String(Base64.decodeBase64(userQues.getBytes("GBK")), "GBK").getBytes("GBK")));

问题完美解决 !



版权声明:本文为pl1612127原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。