Ir al contenido principal
CuteJSON
↑↓ Navegar Enter Seleccionar Esc Cerrar

Como codificar JSON en Base64 sin que se rompa por acentos o emoji

Publicado 2 min de lectura Por Akash Kinkar Pandey

Base64 existe para transportar bytes a traves de algo que solo maneja texto, por eso aparece en URLs de datos, adjuntos de correo, JSON Web Tokens, y cualquier formato de configuracion que deba contener un documento completo dentro de un solo valor de cadena.

El bug que tienen la mayoria de las herramientas Base64 del navegador

La funcion integrada btoa del navegador rechaza cualquier cosa por encima del punto de codigo U+00FF. En el momento en que tu JSON contiene una letra con tilde, un simbolo de moneda o un emoji, btoa lanza un error, por eso tantas herramientas rapidas de Base64 se rompen al instante cuando el texto del mundo real las toca.

Usando el convertidor JSON a Base64

Esta herramienta codifica a bytes UTF-8 primero, que es lo que hace todos los demas lenguajes y todos los servidores, por lo que el resultado coincide con lo que produciria un backend para el mismo documento. Codificar

{"name":"café","price":"₹500","clef":"𝄞"}

produce una cadena Base64 que se decodifica, a traves del propio atob estandar del navegador y TextDecoder, de vuelta al documento original exacto: café, ₹500 y el simbolo musical 𝄞 todos sobreviven, incluido ese ultimo caracter, que necesita un par sustituto en JavaScript y cuatro bytes en UTF-8.

Tres fallos, distinguidos

La decodificacion puede fallar de tres maneras genuinamente diferentes, y agruparlas todas como “entrada invalida” oculta cual estas viendo:

  1. No es Base64 en absoluto. Un caracter fuera del alfabeto Base64 se nombra directamente: This is not Base64: "!" is not a Base64 character, con la posicion.
  2. Base64 valido, pero los bytes no son texto. La cadena se decodifica bien como bytes, pero esos bytes no son UTF-8 valido, lo que generalmente significa que tienes Base64 de un archivo binario en vez de un documento.
  3. Texto valido, pero no es JSON. El Base64 se decodifico perfectamente en una cadena, y esa cadena no es un documento JSON, reportado con el mismo tipo de mensaje que el formateador y validador dan por JSON roto.

Que formatos acepta

La decodificacion tolera un prefijo de URL data:, saltos de linea dentro del texto Base64, y el alfabeto seguro para URL que sustituye - y _ por + y /. Pega directamente una URL de datos que copiaste de la pestana de red de un navegador; el prefijo se elimina automaticamente.

Esto es encriptacion

No. Base64 es una codificacion, no un cifrado. Cualquiera puede decodificarlo con una sola linea de codigo en cualquier lenguaje, incluyendo pegandolo en esta misma herramienta en la otra direccion. Sirve para hacer que los bytes sean seguros para transportar a traves de un canal de solo texto, no para mantenerlos en secreto.

Volver a todas las entradas