在开发Java? Web应用的时候,可能会在服务器端用Java做Base64编码,而在客户端用JavaScript进行解码。这样就要求两边的Base64编码机制保持一致。
使 用Base64编码,可能会碰到各种奇怪情况,甚至怀疑编码有bug。但实际上不是这样的。Base64理论上操作的对象不是字符串而是字节数组。它的原 理就是把ASCII码的255个字符缩小到用64个来表示。具体就是原来三个字节用四个字节表示,编码后长度有一定的增长。
1) 最好一次编码,避免分段编码,确实要分段编码,每一段字节数应该是3的倍数。
长字节流,如果要边读取边编码,每一段必须是3的倍数,否则就可能在还原的时候出乱。一般人喜欢用2的乘方来定义数组,例如 byte[1024],因为不是3的倍数,可能还原时出错。正确的例子是:
byte[] bs=new byte[3*100] ....inputStream.read(bs)......encode(bs )....
对于字符串,一般要整个一次编码,以避免分段编码出错。
当然,如果你分段编码,还原的时候也是一段一段地还原,那是没有问题的。
2)确保字符串还原的时候按照原来的编码还原。
因为它操作的是字节数组,所以对于GBK编码的汉字和UTF-8编码汉字,经过 Base64编码后结果是不一样的。例如“我们”这两个字如果是GBK编码,转成Base64后就是ztLDxw== ;如果是UTF-8编码,转成Base64后就是5oiR5Lus。
也就是 “我们” ==》? getBytes("GBK") ==> Base64
所以Java这边用什么编码转换,在JavaScript那边就要用什么编码还原。要保证Java和JavaScript通用,我们采用Unicode的编码(JavaScript转成UTF-8、GBK不方便,所以就采用了其本身的Unicode编码),具体如下:
服务器端:
1)用getBytes("Unicode")转成Unicode字节数组。
2) 编码成Base64字符串
3)传送到客户端
客户端:
1)Base64 解码成字节数组
2)按Unicode还原
代码如下(相关的函数看附件):
Base64.encode(data,"Unicode"); //java 端编码
decode64(data);?? //javascript解码
?
?
附一:Java中Base64编码
package websharp.util;
免责声明: 本文仅代表作者个人观点,与爱易网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
|