Загрузите содержимое 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 не может справиться с ней.
Ответы
Ответ 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/...