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

标签 javascript sapui5

我有一个文件 uploader 输入,我在其中接受一个文件,将其转换为 base 64 字符串,然后将有效负载发送到 rest api。

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

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

var reader2 = new FileReader();
            reader2.readAsDataURL(file);

            reader2.onload = function (e) {
                var sContentStream = e.target.result;}

最佳答案

抱歉,前提是没有意义。 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);
}

关于javascript - 如何获取使用 Windows-1251 的文件的 base 64 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56291248/

相关文章:

javascript - SAPUI5 日历一排样式

javascript - onmousedown 是什么意思?

javascript - window.getSelection 不工作在 IE11 中不工作

javascript - AJAX 响应后重新加载 amchart

sapui5 - `this.oType.formatValue` 不是一个函数

javascript - 如何在 XML View 中添加没有 syle 信息的 sapUI5 面板?

css - OpenUI5 : Add margins on both sides to ToolPage

Javascript对象通过属性获取对象

javascript - JavaScript 中如何获取字符串之和? (时间格式: 00:00:00)

charts - SAPUI5 图表问题