gpt4 book ai didi

保存为文件的 Javascript Blob 对象包含额外字节

转载 作者:行者123 更新时间:2023-11-28 01:18:30 24 4
gpt4 key购买 nike

我有一个读取字节数组的程序。这些字节应该是 ISO-8859-2 十进制字符代码。我的测试数组有两个元素: 103 是字母 g 179 是字母 ł (l 带尾部)。然后,我从中创建一个 Blob 对象,并使用两种方法检查其内容:

  1. 文件阅读器
  2. 对象URL

第一种方法给出了正确的结果,但第二种方法在保存的 blob 文件中给出了额外的字符。

这是代码:

var bytes = [103, 179];
var chr1 = String.fromCharCode(bytes[0]);
var chr2 = String.fromCharCode(bytes[1]);
var str = '';
str += chr1;
str += chr2;
console.log(str.charCodeAt(0)); //103
console.log(str.charCodeAt(1)); //179
console.log(str.charCodeAt(2)); //NaN

var blob = new Blob([str]);
console.log(blob.size); //3

//Checking Blob contents using first method - FileReader
var reader = new FileReader();
reader.addEventListener("loadend", function() {
var str1 = this.result;
console.log(str1); //g³
console.log(str1.charCodeAt(0)); //103
console.log(str1.charCodeAt(1)); //179
console.log(str1.charCodeAt(2)); //NaN
});
reader.readAsText(blob);

//Checking Blob contents using second method - objectURL
var url = URL.createObjectURL(blob);
$('<a>',{
text: 'Download the blob',
title: 'Download',
href: url

}).appendTo('#my');

为了使用第二种方法,我创建了一个 fiddle 。在 fiddle 中,当您单击“下载”链接并保存然后在二进制编辑器中打开文件时,它由以下字节组成:103、194、179。

我的问题是,194 来自哪里以及如何创建仅包含原始数组中给定字节的 blob 文件(使用 createobjectURL 方法)(在本例中为 [103, 179])。

最佳答案

额外的 194 来自编码问题:

179 是“SUPERCRIPT THREE ”的 unicode 代码点,因此字符串 str 将包含“g³”。创建 blob 后,您将获得以 utf8 编码的字符串:0x67 表示 g,0xC2 0xB3 表示 ³(十进制为 194、179),它需要 3 个字节。当然,如果您使用 FileReader,您将返回 2 个字符“g³”。

为了避免这种情况(如果您不想将所有内容放入utf8中),您可以使用类型化数组来构造blob:

var u8 = new Uint8Array(bytes);
var blob = new Blob([u8]);

这样,您将准确保留所需的字节。

关于保存为文件的 Javascript Blob 对象包含额外字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23535951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com