29 January 2018

base64 encode 之后会产生两个特殊的字符串 +/

URL 特殊符号及对应的十六进制值编码:URL 中“+”加号的问题

'+' URL 中+号表示空格 %2B
' ' URL 中的空格可以用+号或者编码 %20
'/' 分隔目录和子目录 %2F
'?' 分隔实际的 URL 和参数 %3F
'%' 指定特殊字符 %25
'#' 表示书签 %23
'&' URL 中指定的参数间的分隔符 %26
'=' URL 中指定参数的值 %3D

如果在 url 中有 '+' 号,那么后端接收到的实际上是一个 ' ' [空格]

一个解决方案就是,对 base64 encode 之后的字符串做一个替换,将 '+' 和 '/' 去掉。后端在拿到字符串的时候再 replace 回来

来源:Why is base64_encode() adding a slash “/” in the result?

function base64url_encode($s) {
    return str_replace(array('+', '/'), array('-', '_'), base64_encode($s));
}

function base64url_decode($s) {
    return base64_decode(str_replace(array('-', '_'), array('+', '/'), $s));
}

实际上,就是调用一次 urlencode,再 urldecode 一次