我有一个文件 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/