Hace algún tiempo, vi un sitio web que codificaba los datos de reproducción del juego en caracteres Unicode para que pudieras copiar y pegar la dirección para compartirla con amigos. Básicamente quiero hacer lo mismo: tengo algunos datos en un objeto de JavaScript y quiero ponerlos en la barra de direcciones.

Sé que puedo usar jQuery.param o algo así, pero quiero mucho más formato compacto

Resulta que esto es un poco complicado para Google. La mayoría de los resultados de búsqueda muestran acortadores de URL, lo cual es claramente diferente. Estoy no tratando de almacenar una URL corta en mi base de datos para una búsqueda posterior. Todos los datos deben estar en la URL misma.

¿Qué codificación puedo usar para esto? Un enlace o una descripción del algoritmo está bien, pero las impementaciones para Node / JavaScript serían aún mejores.

Solo necesito admitir la última versión de Chrome estable, por lo que no me importa si los navegadores más antiguos no pueden manejar el Unicode. Creo que pondré los datos en la parte del fragmento (después de #), así que solo necesito admitir las reglas de codificación que se apliquen a esa pieza. Creo que casi todo está permitido, ¿no?

2
mpen 14 jun. 2017 a las 22:21

2 respuestas

La mejor respuesta

Ahí tienes https://github.com/qntm/base65536 & https://www.npmjs.com/package/base65536

Base65536 es una codificación binaria optimizada para texto codificado en UTF-32 y Twitter. Este módulo de JavaScript, base65536, es la primera implementación de esta codificación.

Apareció en hackernews hace algún tiempo.

1
enapupe 14 jun. 2017 a las 19:28

Aquí hay una implementación de sugerencia de enapupe:

import Msgpack from 'msgpack-lite';
import Base65536 from 'base65536';

export function uniencode(obj) {
    return Base65536.encode(Msgpack.encode(obj));
}

export function unidecode(str) {
    return Msgpack.decode(Base65536.decode(str));
}

Uso:

let o = {foo:'bar',baz:[1,2,3,4,5],quux:'corge'};
console.log(uniencode(o).length,JSON.stringify(o).length); // 24, 46

Es decir, uniencode tiene aproximadamente la mitad de la longitud de JSON.stringify, o incluso menos según Twitter (.length no cuenta Unicode correctamente. Twitter cuenta lo anterior como 15 caracteres). Una mejor medida es:

function len(str) {
    return [...str].length;
}

Lo que da 15 y 46 respectivamente.

1
mpen 14 jun. 2017 a las 20:00