Подтвердить что ты не робот

Загрузите содержимое BLOB с помощью указанной кодировки

Можно ли изменить кодировку Blob на самом деле? Я пробую это часами, но это не работает. Смотрите.

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);    
});

Мне нужно экспортировать CSV для открытия в Excel, но он всегда сохраняется с UTF-8, и Excel не может справиться с ней.

4b9b3361

Ответ 1

Я нашел решение до публикации.

Изменение кодировки на самом деле не было разрешено. Однако я отправил заголовок UTF-8 для процесса загрузки, и Excel смог правильно понять формат файла. Благодаря этому ответу Эрика Тёйра.

blob = new Blob(["\ufeff", csv_content]);

Ответ 2

В моем случае я использовал Angular JS для получения кодированного CSV файла с сервера в ответ на HTTP POST. Проблема заключалась в том, что CSV, возвращаемые из XMLHttpRequests, представлены как Unicode (я хочу сказать UTF-8, но согласно this, это UTF-16), а не предварительно закодированные двоичные данные. Похоже, это верно и в вашем примере, это чтение CSV из элемента DOM? В этом случае он оказывается представленным как Unicode в памяти, поэтому не имеет значения, какое значение вы задали для метаданных кодирования, данные все еще Юникод.

Мой Angular код делал что-то вроде этого:

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

Внутри handleResponse данные уже были представлены в Unicode. В соответствии с Angular $http служба, не предоставляющая свойство responseType в объекте конфигурации, по умолчанию имеет значение string. Какой в соответствии с Mozilla в конечном итоге представлен как DOMString в UTF-16, тогда как мы действительно хотим, чтобы он был Blob. Установка responseType в blob в файле конфигурации успешно предотвратила декодирование содержимого. Без этого данные ответа были непреднамеренно декодированы до того, как их поместили в Blob.

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

Затем я использовал saveAs(), чтобы заставить браузер предоставить содержимое файла пользователю.

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

У меня возникла идея установить responseType из fooobar.com/info/160319/...