Scarica BLOB contenuto utilizzando il set di caratteri specificato

È possibile cambiare il Blob charset davvero? Sto cercando per ore ma non workds. Vedere questo.

jQuery("#download").click(function() {
    var csv_content = jQuery("#csv").val(),
        download = document.createElement("a"),
        blob = new Blob([csv_content], { type: "text/csv;charset=ISO-8859-1" });

    download.href = window.URL.createObjectURL(blob);
    download.download = "test.csv";

    var event = document.createEvent("MouseEvents");
    event.initMouseEvent(
        "click", true, false, window, 0, 0, 0, 0, 0
        , false, false, false, false, 0, null
    );
    download.dispatchEvent(event);    
});

Ho bisogno di esportare un file CSV per aprire in Excel, ma è sempre salvare con la codifica UTF-8 e Excel è in grado di gestire tutto questo.

 

3 Replies
  1. 104

    Ho trovato la soluzione prima di postare.

    La modifica del set di caratteri non è stato risolto, in effetti. Tuttavia, ho inviato la codifica UTF-8 di intestazione per il processo di download e di Excel è in grado di comprendere il formato di file correttamente. Grazie per questa risposta di Erik Töyrä.

    blob = new Blob(["\ufeff", csv_content]);
    • L’aggiunta di "\ufeff" all’inizio davvero fatto il lavoro!
    • Grazie funziona come un fascino 🙂
    • Ho il sospetto che questo funziona per voi, perché ISO-8859-1 è un sottoinsieme di UTF-8, quindi, anche se il browser restituisce la codifica UTF-8, il prefisso è aggiunto consente di Excel per capire cosa fare. Tuttavia, nel mio caso il contenuto è Shift-JIS, che non è compatibile con la codifica UTF-8 in modo di restituire il contenuto di ri-codificato in UTF-8 non è un’opzione.
    • funziona, Dio vi benedica!!
    • funziona come un fascino, grazie
  2. 8

    Nel mio caso stavo usando Angolare JS per ricevere una codifica file CSV dal server in risposta a un POST HTTP. Il problema era che CSVs tornato da XMLHttpRequests sono rappresentati in formato Unicode (voglio dire UTF-8, ma secondo questo è UTF-16) le stringhe, non pre-codifica binaria dei dati. Sembra che questo è vero nel tuo esempio, è la lettura del CSV da un elemento del DOM? In questo caso si finisce per essere rappresentati in formato Unicode in memoria, in modo da non importa quale valore si imposta la codifica dei metadati, i dati sono ancora Unicode.

    Mio Angolare codice stava facendo qualcosa di simile a questo:

    $http.post('/url', postData, {}).then(handleResponse);

    All’interno handleResponse, i dati è stato già rappresentato in Unicode. Secondo Angolare del $http servizio, non fornendo la responseType proprietà sull’oggetto config cause di default per string. Che secondo Mozilla finisce rappresentato come un DOMString in UTF-16, mentre noi, in realtà vuole essere una Blob. Impostazione del responseType per blob sulla config oggetto impedito con successo il contenuto da raggiungere decodificato. Senza questo, i dati di risposta era inavvertitamente decodificato prima di essere immessi nel Blob.

    $http.post('/url', postData, {responseType: 'blob'}).then(handleResponse);

    Ho quindi utilizzato saveAs() per ottenere il browser di fornire il contenuto del file per l’utente.

    function handleResponse(response) {
        let headers = response.headers();
        let blob = new Blob([response.data], {type: headers['content-type']});
        saveAs(blob, headers['x-filename']);
    }

    Ho avuto l’idea di impostare responseType da https://stackoverflow.com/a/16791296/1225617

    • Grazie! Questo era il mio problema esatto, meno spigoloso.
    • Felice di aiutare, e contento che rispondere a un vecchio di tre anni accettato di rispondere alla domanda aiutato qualcun altro così in fretta.
  3. 0

    se si dispone di alcuni simboli in formato csv e accettato soluzione non risolve il problema.

    blob = new Blob(["\ufeff", csv_content]);
    for csv_content you can try like below.
    function b64DecodeUnicode(str: any) {        
            return decodeURIComponent(atob(str).split('').map((c: any) => {
                return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
            }).join(''));
        }

Lascia un commento