Рассматривая URL-кодировку base 64, я обнаружил, что это очень нестандартная вещь. Несмотря на обилие встроенных функций, которые есть в PHP, для безопасной кодировки URL 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. Равный - это символ заполнения, поэтому модуль Perl заменяет их по мере необходимости при декодировании, но это различие делает две реализации несовместимыми.
Наконец, функция Python urlsafe_b64encode (s) поддерживает заполнение '=', предлагая кому-нибудь добавить эту функцию , чтобы удалить заполнение, которое заметно в результатах Google для '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 без дополнительной кодировки, отсюда исключение или перевод символов '+', '/' и '='. Поскольку не существует определенного стандарта, что является правильным?