Почему символ "\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 шт):

Автор решения: TerryChan Aleksandr

Чтобы занести символ в файл без всяких преобразований в 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))
→ Ссылка