Estoy tratando de generar un CSV corto con el siguiente código:
Fuente
const csv_content = `"Hello"þ"World"þ"#"þ"123"`; const href = 'data:attachment/csv;charset=utf-8,' + encodeURI(csv_content); console.log(href);Copio/paso el valor href en mi navegador y lo descargo.
valor de h ref
data:attachment/csv;charset=utf-8,%22Hello%22%C3%BE%22World%22%C3%BE%22#%22%C3%BE%22123%22Lo abro en Excel pero no puedo mostrar ningún carácter después de # char y el # mismo. Si alguien puede explicarme por qué encodeURI y # me devuelven este problema, ¡sería maravilloso!
El comentario de evolutionxbox resuelve este problema, necesita usar encodeURIComponent en lugar encodeURI
// encodes characters such as ?,=,/,&,: console.log(`?x=${encodeURIComponent('test?')}`); // expected output: "?x=test%3F"Su problema en realidad toca un tema importante, y eso es lo que se debe pasar en una URL frente a lo que se debe pasar en el cuerpo.
Cuando llegue a objetos complejos, como un archivo csv, sería mejor usar el cuerpo para contener esta información, ya que es mucho menos exigente con los caracteres.
Otro motivo es que la URL es información abierta y desprotegida. Si alguna vez creó un archivo csv que contenía datos confidenciales, cualquier persona en el mundo puede verlo. Los datos en el cuerpo (suponiendo que esté usando https) están encriptados y no están abiertos a todos los espectadores.
También es importante recordar los usos correctos de GET , PUT , PATCH , DELETE y POST . Cuando trabajo con el envío de un archivo, sería difícil encontrar una buena razón para usar GET como solicitante (si el solicitante es el que envía el archivo csv), el único de los anteriores donde rompe la convención para enviar datos en el cuerpo de la solicitud. Sin embargo, está perfectamente bien tener datos en un cuerpo de respuesta GET .
El comentario de evolutionxbox resuelve este problema, necesita usar encodeURIComponent en lugar encodeURI
// encodes characters such as ?,=,/,&,: console.log(`?x=${encodeURIComponent('test?')}`); // expected output: "?x=test%3F"