Как я могу использовать UTF-8 в типе BLOB-объектов?
Я должен экспортировать таблицу в CSV-файл.
Данные CSV-файла с сервера по типу Blob.
Blob {size: 2067, type: "text/csv"}
async exportDocumentsByCsv() {
this.commonStore.setLoading(true)
try {
const result = await DocumentSearchActions.exportDocumentsByCsv({
searchOption: this.documentSearchStore.searchOption
})
// first
// const blob = new Blob([result.body], { type: 'text/csv;charset=utf-8;' })
// second
// const blob = new Blob([`\ufeff${result.body}`], { type: 'text/csv;charset=utf-8;' })
const blob = result.body
console.log('result.body', result.body)
const fileName = `document - search - result.csv`
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
// for IE
window.navigator.msSaveOrOpenBlob(blob, fileName)
} else {
FileSaver.saveAs(blob, fileName)
}
this.commonStore.setLoading(false)
} catch (err) {
alert(err.errorMessage)
this.commonStore.setLoading(false)
}
}
Я должен установить UTF-8 или иначе из-за моего языка.
Я пытался решить эту проблему, но я не знаю, как это исправить.
Я искал исправить эту проблему с помощью \ufeff
но когда я пытаюсь использовать это как второй способ, это не работает для меня.
| [object | Blob] |
1 ответ
Blob не заботится о кодировке для вас, он видит только двоичные данные. Единственное преобразование это делает, если вы передаете в DOMString UTF-16 в BlobsList конструктора
Лучшее в вашей ситуации - настроить все в вашем приложении от сервера до фронта как UTF-8 и гарантировать, что все отправляется с использованием UTF-8. Таким образом, вы сможете напрямую сохранить ответ сервера, и он будет в UTF-8.
Теперь, если вы хотите преобразовать текстовый файл из известной кодировки в UTF-8, вы можете использовать TextDecoder, который может декодировать представление двоичных данных ArrayBuffer из заданной кодировки в DOMString, который затем можно использовать для генерации UTF-8 Blob:
/* const data = await fetch(url)
.then(resp=>resp.arrayBuffer())
.then(buf => new Uint8Array(buf));
*/
const data = new Uint8Array([147, 111, 152, 94 ]);
// the original data, with Shift_JIS encoding
const shift_JISBlob = new Blob([data]);
saveAs(shift_JISBlob, "shift_JIS.txt");
// now reencode as UTF-8
const encoding = 'shift_JIS';
const domString = new TextDecoder(encoding).decode(data);
console.log(domString); // here it's in UTF-16
// UTF-16 DOMStrings are converted to UTF-8 in Blob constructor
const utf8Blob = new Blob([domString]);
saveAs(utf8Blob, 'utf8.txt');
function saveAs(blob, name) {
const a = document.createElement('a');
a.href = URL.createObjectURL(blob);
a.download = name;
a.textContent = 'download ' + name;
document.body.append(a);
}
a{display: block;}