La biblioteca Java 8 Base64 tiene dos variantes que se pueden usar en la creación de URI: la "Básica" y la "URL y nombre de archivo seguro". La documentación apunta a RFC 4648 Table 2 como una explicación de las diferencias.
Después de leer la especificación, todavía no me queda claro cuál es la diferencia práctica entre ambas codificaciones: ¿son ambos estándares "ampliamente" compatibles? ¿Qué pasa con los navegadores específicamente? ¿Se recomienda la codificación segura de URL y nombre de archivo para la codificación de URI de datos? ¿Existen limitaciones de soporte conocidas?
La forma más fácil es proporcionar un ejemplo (en mi humilde opinión):
Base64.Encoder enc = Base64.getEncoder(); Base64.Encoder encURL = Base64.getUrlEncoder(); byte[] bytes = enc.encode("subjects?_d".getBytes()); byte[] bytesURL = encURL.encode("subjects?_d".getBytes()); System.out.println(new String(bytes)); // c3ViamVjdHM/X2Q= notice the "/" System.out.println(new String(bytesURL)); // c3ViamVjdHM_X2Q= notice the "_" Base64.Decoder dec = Base64.getDecoder(); Base64.Decoder decURL = Base64.getUrlDecoder(); byte[] decodedURL = decURL.decode(bytesURL); byte[] decoded = dec.decode(bytes); System.out.println(new String(decodedURL)); System.out.println(new String(decoded)); Observe cómo uno es URL safe y el otro no.
De hecho, si observa la implementación, hay dos tablas de búsqueda que se utilizan para la codificación: toBase64 y toBase64URL . Solo hay dos caracteres que difieren para ellos:
+ y / para toBase64 frente a - y _ para toBase64URL .
Entonces, ¿parece que su pregunta es un URI seguro y debería usarse allí? ; la respuesta es sí.
Ejecutar algunas pruebas, codificar un URI de datos usando base64 "URL y nombre de archivo seguro" produce URI que Chrome no reconoce.
Ejemplo: data:text/plain;base64,TG9yZW0/aXBzdW0= se decodifica correctamente en Lorem?ipsum , mientras que su homólogo seguro para URL data:text/plain;base64,TG9yZW0_aXBzdW0= no lo está (ERR_INVALID_URL).