Khi xem mã hóa 64 cơ sở an toàn của URL, tôi đã tìm thấy nó là một điều rất không chuẩn. Mặc dù số lượng các hàm dựng sẵn có sẵn mà PHP đã có, nhưng không có một hàm mã hóa 64 cơ sở an toàn cho URL. Trên trang hướng dẫn cho base64_encode()
, hầu hết các ý kiến đề nghị sử dụng mà chức năng, được bao bọc bởi strtr()
:Việc thay thế ký tự nào cần được thực hiện để làm cho URL mã hóa cơ sở 64 an toàn?
function base64_url_encode($input)
{
return strtr(base64_encode($input), '+/=', '-_,');
}
Các module Perl duy nhất tôi có thể tìm thấy trong lĩnh vực này là MIME::Base64::URLSafe (source), trong đó thực hiện việc thay đổi sau đây trong nội bộ:
sub encode ($) {
my $data = encode_base64($_[0], '');
$data =~ tr|+/=|\-_|d;
return $data;
}
không giống như các chức năng PHP ở trên, phiên bản Perl này giọt '=' (bằng) nhân vật hoàn toàn, chứ không phải thay thế nó bằng '' (dấu phẩy) như PHP làm. Bằng là một ký tự đệm, do đó, mô-đun Perl thay thế chúng khi cần thiết khi giải mã, nhưng sự khác biệt này làm cho hai triển khai không tương thích.
Cuối cùng, hàm Python urlsafe_b64encode(s) giữ '=' đệm xung quanh, khiến một người nào đó để đưa lên this function để loại bỏ các đệm trong đó cho thấy nổi bật trong kết quả của Google cho '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))
Mong muốn ở đây là để có một chuỗi có thể được bao gồm trong URL mà không cần mã hóa thêm, do đó là bỏ hoặc dịch các ký tự '+', '/' và '='. Vì không có tiêu chuẩn được xác định, đúng cách là gì?
Điều đó sử dụng số ký tự không cần thiết. Tại sao không chỉ urlencode chuỗi nhị phân ở nơi đầu tiên? – recursive