5.4.2 非ASCII码字符编码

Base64算法很好地解决了非ASCII码字符的传输问题,譬如中文字符的传输问题。

ASCII码可以表示十进制范围为0~127的字符,对应二进制范围是0000 0000~0111 1111。ASCII码包括阿拉伯数字、大小写英文字母和一些控制符,但却没有包含双字节编码的字符,如中文字符。因此有了GB2312、GBK和UTF-8等编码。GB2312、GBK用2个字节表示一个汉字,UTF-8编码则用3个字节表示一个汉字。Base64算法实现时,对6位二进制码添加高2位0,恰恰保护了非ASCII码字符在通过有问题的网关时不发生问题。

我们以字符串“密”为例,字符串“密”对应的UTF-8编码就是-27,-81,-122。我们对其做如下Base64编码:


字符 密

UTF-8码-27-81-122

二进制码 11100101 10101111 10000110

4-6二进制码 111001 011010 111110 000110

4-8二进制码 00111001 00011010 00111110 00000110

十进制码 57 26 62 6

字符表映射码 5 a+G


字符串“密”经过Base64编码后得到字符串“5a+G”。

当然,如果使用GBK编码就不是这个结果了!字符串“密”对应的GBK编码是-61,-36,经过Base64编码后就是字符串“w9w=”了。