如何获得使用Windows-1251的文件的base 64编码

时间:2019-05-24 10:56:29

标签: javascript sapui5

我有一个文件上传器输入,在这里我接受一个文件,将其转换为64位字符串,然后将有效载荷发送到rest api。

但是,当我为utf-8文件编码base64时,它工作正常。但是,如果我尝试获取“ window-1251”文件的base64字符串,则无法正确转换为字符串,并且api会引发错误,因为base64字符串无效。

所以我的问题是如何获取使用window-1251进行编码的文件的base64字符串?

generator.__next__()

1 个答案:

答案 0 :(得分:1)

对不起,但前提没有道理。 FileReader.readAsDataURL 将始终从您提供给它的内容中返回一个有效的base64字符串=>二进制数据。

这些字节代表具有给定编码的文本文件这一事实被算法忽略了。

const rand_data = crypto.getRandomValues(new Uint8Array(50));
const blob = new Blob([rand_data]);
const reader = new FileReader();
reader.onload = e => {
  const dataURL = reader.result
  const base64 = dataURL.slice(dataURL.indexOf(',')+1);
  console.log(base64);
  console.log(atob(base64)); // would throw if invalid data
};
reader.readAsDataURL(blob);

因此,您正在寻找问题的错误结尾:使用者在读取Windows-1251编码的文本文件时可能会遇到问题,但这不是FileReader的错。

现在,如果您愿意在浏览器中将这种编码转换为UTF-8,那么仍然可以实现,但是您需要一种方法来知道给定的文件采用哪种编码。

const win_1251 = new Blob([Uint8Array.from([200])]); // И in windows-1251
// to prove it's not UTF-8
readUTF8Text(win_1251); // �

const reencode_reader = new FileReader();
reencode_reader.onload = e => {
  const utf_8_arr = new TextDecoder('windows-1251')
    .decode(new Uint8Array(reencode_reader.result));
  const utf_8 = new Blob([utf_8_arr], {type: 'text/plain'})
  makeDataURL(utf_8);
  readUTF8Text(utf_8); // И
};
reencode_reader.readAsArrayBuffer(win_1251);

function makeDataURL(blob) {
  const reader = new FileReader();
  reader.onload = e => {
    console.log(reader.result);
  };
  reader.readAsDataURL(blob);
}
function readUTF8Text(blob) {
  const reader = new FileReader();
  reader.onload = e => {
    console.log(reader.result);
  };
  reader.readAsText(blob);
}