在研究URL安全的base64编码时,我发现这是一件非常不标准的事情。尽管PHP有大量内置函数,但没有一个用于URL安全的base64编码。在
与上面的PHP函数不同,这个Perl版本完全删除'='(等号)字符,而不像PHP那样用','(逗号)替换它。等号是填充字符,因此Perl模块在解码时根据需要替换它们,但这种差异使得这两个实现不兼容。
最后,Python函数 urlsafe_b64encode(s) 保留'='填充符号,促使有人发布 this function 来移除填充符号,在谷歌搜索中明显显示为 'python base64 url safe'。
这里的愿望是拥有一个字符串,可以在URL中直接使用而无需进一步编码,因此放弃或转换了字符'+'、'/'和'='。由于没有明确定义的标准,什么是正确的方法?
base64_encode()
的手册页面上,大多数评论建议使用该函数,并包装strtr()
。function base64_url_encode($input)
{
return strtr(base64_encode($input), '+/=', '-_,');
}
我在这个领域只找到了一个Perl模块MIME::Base64::URLSafe(源代码),它内部执行以下替换操作:
sub encode ($) {
my $data = encode_base64($_[0], '');
$data =~ tr|+/=|\-_|d;
return $data;
}
与上面的PHP函数不同,这个Perl版本完全删除'='(等号)字符,而不像PHP那样用','(逗号)替换它。等号是填充字符,因此Perl模块在解码时根据需要替换它们,但这种差异使得这两个实现不兼容。
最后,Python函数 urlsafe_b64encode(s) 保留'='填充符号,促使有人发布 this function 来移除填充符号,在谷歌搜索中明显显示为 'python base64 url safe'。
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中直接使用而无需进一步编码,因此放弃或转换了字符'+'、'/'和'='。由于没有明确定义的标准,什么是正确的方法?