Почему символ "\xD3" превращается в "\xC3" после скачивания файла и как предотвратить это?
У меня есть функция для скачивания файла с текстом text и названием файла filename
function download_file_with_content(filename, text) {
var element = document.createElement('a');
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
element.setAttribute('download', filename);
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
}
Напишу допустим код такой:
download_file_with_content('test.txt', '\xD3')
Попробуйте открыть файл через HxD и увидите что он записал явно не значение '\xD3'(число 211) а '\xC3'(Число 195)
С чем это может быть связано? Или если это не объяснимо, то какие варианты решения данной проблемы могут быть? Я пробовал также загружать при помощи blob и mime-type=octet-stream
Ответы (1 шт):
Чтобы занести символ в файл без всяких преобразований в utf8 требуется использовать ArrayBuffer и Blob
Записываем символ числом
var arrbuf = new ArrayBuffer(1)
var uint8 = new Uint8Array(arrbuf)
uint8[0] = 211
После этого создаём Blob
var blb = new Blob([strleft, arrbuf, strright])
После этого мы скачиваем файл уже не через text-plain и что-то ещё а используем функцию URL.createObjectURL(blb)
Тогда итоговое решение проблемы становится так:
element.setAttribute('href', URL.createObjectURL(blb))