php - online - ¿Por qué base64_encode() agrega una barra inclinada "/" en el resultado?
hash base64 (7)
Estoy codificando el sufijo de URL de mi aplicación:
$url = ''subjects?_d=1'';
echo base64_encode($url);
// Outputs
c3ViamVjdHM/X2Q9MQ==
Observe la barra antes de ''X2''.
¿Por qué está pasando esto? Pensé que base64 solo sacaba AZ, 0-9 y ''='' como relleno. He intentado usar un codificador base64 en línea para verificar, y parece que base64 siempre hace esto. No puedo decir si es el guión bajo "_" o el signo de interrogación "?" o el "=" tal vez?
AZ tiene 26 caracteres. 0-9 es 10 caracteres. = es un personaje. Eso da un total de 37 caracteres, que es algo así como 64.
/
es uno de los 64 caracteres. Puedes ver una lista completa en la página de wikipedia .
Además de todas las respuestas anteriores, señalando que / es parte del alfabeto base64 esperado, debe tenerse en cuenta que la razón particular por la que vio un / en su cadena codificada, es porque cuando base64 codifica texto ASCII, la única forma de generar un / es tener un signo de interrogación en una posición divisible por tres.
Lo siento, pensaste mal. A-Za-z0-9 solo tiene 62 caracteres. Base64 usa dos caracteres adicionales, en caso de PHP /
y +
.
No está directamente relacionado, y suficientes personas arriba han respondido y explicado las soluciones bastante bien.
Sin embargo, yendo un poco fuera del alcance de las cosas. Si desea texto base legible, intente buscar en Base58 . Vale la pena considerarlo si solo quieres caracteres alfanuméricos.
No hay nada especial en eso.
La base 64 "alfabeto" o "dígitos" son AZ, az, 0-9 más dos caracteres adicionales + (más) y / (barra inclinada).
Luego puede codificar / con% 2f si lo desea.
No. El alfabeto Base64 incluye AZ, az, 0-9 y +
y /
.
Puede reemplazarlos si no le importa la portabilidad hacia otras aplicaciones.
Ver: http://en.wikipedia.org/wiki/Base64#Variants_summary_table
Puede usar algo como esto para usar sus propios símbolos en su lugar (reemplazar -
y _
por cualquier cosa que desee, ¡siempre que no esté en el alfabeto base64, por supuesto!).
El siguiente ejemplo convierte la base64 normal a base64url como se especifica en 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));
}
Para base64, el juego de caracteres válido es: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + /
the = se usa como relleno para los últimos bytes
METRO.