在查看 URL 安全 base 64 编码时,我发现它是一个非常不标准的东西。尽管 PHP 具有大量内置函数,但没有一个用于 URL 安全 base 64 编码的函数。在 的手册页上base64_encode()
,大多数评论都建议使用该函数,并用strtr()
:
function base64_url_encode($input)
{
return strtr(base64_encode($input), '+/=', '-_,');
}
我能在这个区域找到的唯一 Perl 模块是MIME::Base64::URLSafe ( source ),它在内部执行以下替换:
sub encode ($) {
my $data = encode_base64($_[0], '');
$data =~ tr|+/=|\-_|d;
return $data;
}
与上面的 PHP 函数不同,这个 Perl 版本完全删除了 '='(等于)字符,而不是像 PHP 那样用 ','(逗号)替换它。Equals 是一个填充字符,因此 Perl 模块会在解码时根据需要替换它们,但是这种差异使两种实现不兼容。
最后,Python 函数urlsafe_b64encode(s)保留了 '=' 填充,提示有人设置此函数以删除在'python base64 url safe'的 Google 结果中显着显示的填充:
from base64 import urlsafe_b64encode, urlsafe_b64decode
def uri_b64encode(s):
return urlsafe_b64encode(s).strip('=')
def uri_b64decode(s):
return urlsafe_b64decode(s + '=' * (4 - len(s) % 4))
这里的愿望是有一个可以包含在 URL 中的字符串而无需进一步编码,因此丢弃或翻译字符“+”、“/”和“=”。既然没有明确的标准,那么正确的方法是什么?