Почему base64_encode () добавляет слэш «/» в результате?

Я кодирую суффикс URL моего приложения:

$url = 'subjects?_d=1'; echo base64_encode($url); // Outputs c3ViamVjdHM/X2Q9MQ== 

Обратите внимание на косую черту перед «X2».

Почему это происходит? Я думал, что base64 выводит только AZ, 0-9 и '=' в качестве дополнения? Я пробовал использовать онлайн-кодировщик base64 для проверки, и кажется, что base64 всегда это делает. Я не могу сказать, является ли это подчеркиванием «_» или вопросительным знаком «?» или "=", возможно?

Нет. Алфавит Base64 включает AZ, az, 0-9 и + и / .

Вы можете заменить их, если вам не нужна переносимость в отношении других приложений.

См .: http://en.wikipedia.org/wiki/Base64#Variants_summary_table

Вы можете использовать что-то подобное, чтобы вместо этого использовать свои собственные символы (замените - и _ на все, что хотите, если это не в базовом алфавите base64, конечно!).

Следующий пример преобразует нормальный base64 в base64url, как указано в RFC 4648 :

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

Извините, вы ошибались. A-Za-z0-9 получает только 62 символа. Base64 использует два дополнительных символа, в случае PHP / и + .

В этом нет ничего особенного.

Основой 64 "алфавита" или "цифр" являются AZ, az, 0-9 плюс два дополнительных символа + (плюс) и / (косая черта).

Вы можете позже кодировать / с% 2f, если хотите.

AZ – 26 символов. 0-9 – 10 символов. = один символ. Это дает в общей сложности 37 символов, что немного отличается от 64.

/ является одним из 64 символов. Вы можете увидеть полный список на странице wikipedia .

В дополнение ко всем вышеприведенным ответам, указывающим, что / является частью ожидаемого алфавита base64, следует отметить, что особая причина, по которой вы видели / в вашей закодированной строке, заключается в том, что когда base64 кодирует текст ASCII, единственный способ сгенерировать a /, чтобы иметь знак вопроса в позиции, делящейся на три.

Для base64 действительная кодировка: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + /

the = используется как filler для последних байтов

М.

Не имеет прямого отношения, и достаточно людей выше ответили и объяснили решения достаточно хорошо.

Однако, немного отставая от объема вещей. Если вам нужен читаемый базовый текст, попробуйте взглянуть на Base58 . Стоит подумать, хотите ли вы только буквенно-цифровые символы.