web-dev-qa-db-fra.com

Pourquoi base64_encode () ajoute-t-il une barre oblique "/" dans le résultat?

J'encode le suffixe URL de mon application:

$url = 'subjects?_d=1';
echo base64_encode($url);

// Outputs
c3ViamVjdHM/X2Q9MQ==

Remarquez la barre oblique avant "X2".

Pourquoi cela arrive-t-il? Je pensais que base64 ne produisait que A-Z, 0-9 et '=' comme rembourrage? J'ai essayé d'utiliser un encodeur en ligne base64 pour vérifier, et il semble que base64 le fasse toujours. Je ne peux pas dire si c'est le trait de soulignement "_" ou le point d'interrogation "?" ou le "=" peut-être?

38
BadHorsie

Non. L'alphabet Base64 comprend A-Z, a-z, 0-9 et + et /.

Vous pouvez les remplacer si vous ne vous souciez pas de la portabilité vers d'autres applications.

Voir: http://en.wikipedia.org/wiki/Base64#Variants_summary_table

Vous pouvez utiliser quelque chose comme ceux-ci pour utiliser vos propres symboles à la place (remplacez - et _ par tout ce que vous voulez, tant qu'il n'est pas dans l'alphabet de base base64, bien sûr!).

L'exemple suivant convertit le base64 normal en base64url comme spécifié dans 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));
}
80
Artefact2

En plus de toutes les réponses ci-dessus, soulignant que / fait partie de l'attendu base64 alphabet, il convient de noter que la raison particulière pour laquelle vous avez vu un / dans votre chaîne codée, parce que lorsque base64 encodage ASCII texte, la seule façon de générer un / est d'avoir un point d'interrogation dans une position divisible par trois.

11
Snorbuckle

Désolé, vous pensiez mal. A-Za-z0-9 ne vous donne que 62 caractères. Base64 utilise deux caractères supplémentaires, dans le cas de PHP / et +.

6
deceze

Il n'y a rien de spécial là-dedans.

Les "alphabets" ou "chiffres" de base 64 sont A-Z, a-z, 0-9 plus deux caractères supplémentaires + (plus) et/(barre oblique).

Vous pouvez ultérieurement encoder/avec% 2f si vous le souhaitez.

4
Igor Chubin

A-Z est de 26 caractères. 0-9 est de 10 caractères. = est un caractère. Cela donne un total de 37 caractères, ce qui est bien en deçà de 64.

/ est l'un des 64 caractères. Vous pouvez voir une liste complète sur la page wikipedia .

3
Quentin

Pour base64, le jeu de caractères valide est: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + /

le = est utilisé comme remplissage pour les derniers octets

M.

2
poussma

Pas directement lié, et suffisamment de personnes ci-dessus ont répondu et expliqué assez bien les solutions.

Cependant, sortir un peu du cadre des choses. Si vous voulez un texte de base lisible, essayez de regarder Base58. Cela vaut la peine de considérer si vous ne voulez que des caractères alphanumériques.

2
tfont