在base64转码时,+号在url中会被转成空格,/号会被当成url分隔符,而我们又习惯在接收到参数后过滤参数两端的空格,所以如果在浏览器url上传输这些值,拿到值后再过滤掉两端的空格,然后再decode这个base64编码,结果肯定会出问题。比如字的base64编码是5p2+字的base64编码是6JW+,我们试试把+号去掉再decode:

var_dump(base64_decode('5p2'));
var_dump(base64_decode('6JW'));

为了避免这个问题,我们可以把+号换成横杠-/号换成下划线_,然后再在url上传输,接收到参数后,只要在解码前把这两个特殊替换回+号和/号,然后再解码,这样就不会出错了,下面是一个PHP的实现方法示例:

<?php
    /**
     * base64_encode后,把+替换成-,把/替换成_,因为这两个符号在url中会被转换
     * @param $str
     * @return mixed
     */
    function base64Encode($str){
        return strtr(base64_encode($str), '+/', '-_');
    }

    /**
     * 把-替换回+,把_替换回/后,再decode
     * @param $str
     * @return mixed
     */
    function base64Decode($str){
        return base64_decode(strtr($str, '-_', '+/'));
    }
?>